小编Ben*_*ahi的帖子

自动将进入/退出功能日志添加到项目

我有第三方源代码,我必须调查.我想知道调用函数的顺序,但我不想浪费时间输入:

printf("Entered into %s", __FUNCTION__)
Run Code Online (Sandbox Code Playgroud)

printf("Exited from %s", __FUNCTION__)
Run Code Online (Sandbox Code Playgroud)

对于每个功能,我也不想触摸任何源文件.

你有什么建议吗?是否有一个编译器标志可以自动为我执行此操作?

澄清评论:

  • 我将交叉编译源代码以在ARM上运行它.
  • 我将用gcc编译它.
  • 我不想分析静态代码.我想跟踪运行时.所以doxygen不会让我的生活更轻松.
  • 我有源,我可以编译它.
  • 我不想使用面向方面编程.

编辑:我发现gdb提示符中的'frame'命令在那个时间点打印当前帧(或者,你可以说是函数名).也许,每次调用函数时,都可以(使用gdb脚本)调用'frame'命令.你怎么看?

c c++ compiler-construction debugging logging

25
推荐指数
2
解决办法
1万
查看次数

在python中检测空函数定义

我需要检测函数是否为空定义.它可以像:

def foo():
    pass
Run Code Online (Sandbox Code Playgroud)

或者喜欢:

def foo(i, *arg, **kwargs):
    pass
Run Code Online (Sandbox Code Playgroud)

或者喜欢:

foo = lambda x: None
Run Code Online (Sandbox Code Playgroud)

使用'inspect'模块检测它们的最优雅方法是什么?有没有比这更好的方法:

def isEmptyFunction(func):
    e = lambda: None
    return func.__code__.co_code == e.__code__.co_code
Run Code Online (Sandbox Code Playgroud)

python introspection code-inspection

11
推荐指数
1
解决办法
1947
查看次数


为什么有针对C++ 14/17的网络库提案?

尽管TCP/UDP/IP是常用的协议,但我不明白他们为什么希望它成为ISO C++标准的一部分.这些与语言的核心无关.数据结构是普遍需要的工具,因此STL是有意义的,但这些协议过于具体IMO.

c++ standards iso

10
推荐指数
2
解决办法
8789
查看次数

当你使用std :: move返回时,"return-by-rvalue-ref"和"return-by-value"之间的区别?

考虑以下代码:

#include <iostream>
using namespace std;

struct I {
    I(I&& rv) { cout << "I::mvcotr" << endl; }
};

struct C {
    I i;
    I&& foo() { return move(i) };
    }
};

int main() {
    C c;
    I i = c.foo();
}
Run Code Online (Sandbox Code Playgroud)

C包含I.而C :: foo()允许你将我移出C.上面使用的成员函数有什么区别:

I&& foo() { return move(i) }; // return rvalue ref
Run Code Online (Sandbox Code Playgroud)

和以下替换成员函数:

I foo() { return move(i) }; // return by value
Run Code Online (Sandbox Code Playgroud)

对我来说,他们似乎做了同样的事情:I i = c.foo();导致打电话I::I(I&&);.

这个例子中没有涉及到什么后果?

c++ rvalue rvalue-reference c++11

9
推荐指数
1
解决办法
302
查看次数

Paramiko bug:即使我设置'timeout',当对等方无法访问时,SSHClient.connect()方法也会挂起

这是一个使用paramiko的python代码片段:

import paramiko

sshClient = paramiko.SSHClient()
sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy)
sshClient.connect(_peerIp, username=_username, password=_password, timeout=3.0)
Run Code Online (Sandbox Code Playgroud)

一旦我运行脚本,我也拔掉了_peerIp的网络电缆.并且connect()方法挂起.即使超时是3.0,它已经是10分钟,它仍然挂起.

(我认为TCP连接是在瞬间建立的,我在ssh建立期间拔掉了电缆)

那么,你知道任何解决方法吗?我的脚本将在制造工厂运行,它不能在这种情况下挂起并正确处理它.

编辑:

它只是例外:

No handlers could be found for logger "paramiko.transport"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 327, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 438, in _auth
    self._transport.auth_publickey(username, key)
  File "/usr/lib/pymodules/python2.6/paramiko/transport.py", line 1234, in auth_publickey
    return self.auth_handler.wait_for_response(my_event)
  File "/usr/lib/pymodules/python2.6/paramiko/auth_handler.py", line 163, in wait_for_response
    raise e
socket.error: [Errno 113] No route to host
Run Code Online (Sandbox Code Playgroud)

好吧,至少它最终引发了异常,但我认为这不是预期的行为.如果超时为3.0,则connect()方法应在超时到期后返回一些内容.

python timeout paramiko

8
推荐指数
0
解决办法
3002
查看次数

通过弹出最后一个类型来创建一个新的元组类

我尝试了以下代码,但它给出了:

main.cpp:29:22:错误:聚合'pop<std::tuple<int, char, float> > p'类型不完整,无法定义

我错过了什么?

template <typename T>
struct pop;

template <typename E, typename... Ts>
struct pop<tuple<Ts..., E>> {
    using result = tuple<Ts...>;
};

tuple<int, char, float> t;
typename pop<decltype(t)>::result p;
Run Code Online (Sandbox Code Playgroud)

如果Ts ...必须在类型列表的末尾,为什么它在http://en.cppreference.com/w/cpp/language/parameter_pack中的示例中有效:

template<class A, class B, class...C> void func(A arg1, B arg2, C...arg3)
{
    container<A,B,C...> t1;  // expands to container<A,B,E1,E2,E3> 
    container<C...,A,B> t2;  // expands to container<E1,E2,E3,A,B> 
    container<A,C...,B> t3;  // expands to container<A,E1,E2,E3,B> 
}
Run Code Online (Sandbox Code Playgroud)

variadic-templates c++11

8
推荐指数
1
解决办法
177
查看次数

确定类型是否为类类型?

在"C++模板 - 完整指南 - 第二版"一书的第19.8.4章中,作者展示了如何在编译时确定类型是否为类类型:

#include <iostream>
#include <type_traits>
using namespace std;

template <typename T, typename = void_t<>>
struct IsClass : false_type { };

template <typename T>
struct IsClass<T, void_t<int T::*>> : true_type { };

int main()
{
    struct S { };
    cout << IsClass<S>::value; // prints 1
}
Run Code Online (Sandbox Code Playgroud)

本段解释了部分特化如何检测类类型:

...只有类类型可以用作指向成员类型的基础.也就是说,在表单的类型构造中X Y::*,Y只能是类类型.以下公式IsClass<T>利用属性(并int任意选择类型X)

我不明白为什么选择int作为X工作,即使我们测试IsClass<>一个S完全没有成员的结构(它也适用于具有其他成员的类类型int)

c++ templates partial-specialization sfinae type-traits

8
推荐指数
1
解决办法
150
查看次数

如果lambda使用std :: move()捕获不可复制的对象,为什么它不可移动?

这是我生成错误的示例代码:

#include <functional>
using namespace std;

struct S {
    S() = default;
    S(const S&) = delete;
    S(S&&) = default;
    S& operator=(const S&) = delete;
    S& operator=(S&&) = delete;
};

template <typename F>
void post(F&& func)
{
    function<void()> f{forward<F>(func)};
}

int main()
{
    S s;
    post([s2 = move(s)] { });
}
Run Code Online (Sandbox Code Playgroud)

拉姆达在里面main(),我捕捉到局部变量s使用std::move().在调用post()之前,s2必须已成功移动构造.

但是,在里面post(),f不能使用对该lambda类型的rvalue引用构造.

如果我删除,s2 = move(s),f可以用这个右值引用来构建.

为什么添加s2 = move(s)渲染lambda不可移动?

在这里,是一个尝试coliru 的链接.

c++ lambda function move c++14

7
推荐指数
1
解决办法
241
查看次数

通过消息传递进行通信的软件模块的"多进程"与"单进程多线程"

我们需要构建一个软件框架(或中间件),以便在单个机器上运行的不同软件组件(或模块)之间实现消息传递.该框架将提供以下功能:

  • 模块之间的通信是通过"消息传递".
  • 每个模块都有自己的消息队列和消息处理程序线程,它将同步处理每个传入消息.

根据上述要求,以下哪种方法是正确的(有其推理)?:

  1. 将模块实现为进程,并通过共享内存进行消息传递
  2. 在单个进程中将模块实现为线程,并通过将消息对象推送到目标模块的消息队列来进行消息传递.

有消息来源,有一些明显的缺点和优点:

  • 在Option-2中,如果一个模块导致分段错误,则该过程(因此整个应用程序)将崩溃.并且一个模块可以直接访问/改变另一个模块的内存,这可能导致难以调试的运行时错误.
  • 但是使用Option-1,您需要处理需要通信的模块刚刚崩溃的状态.如果软件中有N个模块,则系统中可能存在2 ^ N个活动/崩溃状态,这些状态会影响模块上运行的算法.
  • 同样在Option-1中,发送方不能假设接收方已收到消息,因为它可能在那一刻崩溃了.(但是系统可以警告所有模块特定模块已经崩溃;这样,发送方可以断定接收方将无法处理该消息,即使它已成功接收到该消息)

我赞成Option-2,但我不确定我的论点是否足够稳固.你有什么看法?

编辑:根据要求澄清,这里有更多的规格细节:

  • 这是一个将在Linux OS上运行的嵌入式应用程序.
  • 不幸的是,我无法告诉你项目本身,但我可以说项目有多个组件,每个组件都将由自己的团队(3-4人)开发,并决定这些组件之间的通信组件/模块是通过某种消息传递框架.
  • C/C++将用作编程语言.
  • "模块接口API"将自动提供给模块开发人员的是:(1)消息/事件处理程序线程循环,(2)同步消息队列,(3)函数指针成员变量,您可以在其中设置消息处理函数.

multithreading middleware message-queue multiprocessing inter-process-communicat

6
推荐指数
2
解决办法
8379
查看次数