我有第三方源代码,我必须调查.我想知道调用函数的顺序,但我不想浪费时间输入:
printf("Entered into %s", __FUNCTION__)
Run Code Online (Sandbox Code Playgroud)
和
printf("Exited from %s", __FUNCTION__)
Run Code Online (Sandbox Code Playgroud)
对于每个功能,我也不想触摸任何源文件.
你有什么建议吗?是否有一个编译器标志可以自动为我执行此操作?
澄清评论:
编辑:我发现gdb提示符中的'frame'命令在那个时间点打印当前帧(或者,你可以说是函数名).也许,每次调用函数时,都可以(使用gdb脚本)调用'frame'命令.你怎么看?
我需要检测函数是否为空定义.它可以像:
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) 如何使用Core Graphics/Quartz 2D API在iOS中绘制这样的锥形渐变?
圆锥形渐变样本http://ods.com.ua/win/eng/other/gimpdoc-html/painta27.gif
尽管TCP/UDP/IP是常用的协议,但我不明白他们为什么希望它成为ISO C++标准的一部分.这些与语言的核心无关.数据结构是普遍需要的工具,因此STL是有意义的,但这些协议过于具体IMO.
考虑以下代码:
#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&&);.
这个例子中没有涉及到什么后果?
这是一个使用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()方法应在超时到期后返回一些内容.
我尝试了以下代码,但它给出了:
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) 在"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)
这是我生成错误的示例代码:
#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 的链接.
我们需要构建一个软件框架(或中间件),以便在单个机器上运行的不同软件组件(或模块)之间实现消息传递.该框架将提供以下功能:
根据上述要求,以下哪种方法是正确的(有其推理)?:
有消息来源,有一些明显的缺点和优点:
我赞成Option-2,但我不确定我的论点是否足够稳固.你有什么看法?
编辑:根据要求澄清,这里有更多的规格细节:
multithreading middleware message-queue multiprocessing inter-process-communicat