是否有一个C++宏获取当前的命名空间和函数名称?例:
namespace foo {
namespace bar {
void baz(int i, double d) {
std::cout << MACRO << std::endl;
}
}
}
Run Code Online (Sandbox Code Playgroud)
会打印foo::bar::baz.我知道,__FUNCTION__但它没有给出命名空间.并BOOST_CURRENT_FUNCTION给出了整个签名,包括.参数和返回类型:
void foo::bar::baz(int, double)
Run Code Online (Sandbox Code Playgroud)
也许,是否可以编写一个从中提取命名空间和函数名称的宏BOOST_CURRENT_FUNCTION?
我想将其用于日志记录,以获取日志字符串
foo::bar::baz -- blah logging message blah
Run Code Online (Sandbox Code Playgroud) 我试图找出一堆代码中哪里缺少命名空间的右大括号(即得到:
\n\nAt end of source: error: expected a "}"\nRun Code Online (Sandbox Code Playgroud)\n\n错误)。也许有更聪明的方法可以解决这个问题,但是 - 我想尝试在代码中的不同点检查当前的命名空间是什么。我不需要宏;我不需要字符串;我不需要运行时存在的东西。我只想让编译器以某种方式打印名称空间。如果它位于#error、 a#warning或某些构造中,如果编译失败,会产生其中的命名空间错误,对我来说没问题。
我想概括的例子:
\n\nnamespace ns1 { }\nnamespace ns2 {\nnamespace ns3 {\n\n// MAGIC GOES HERE\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这个源文件缺少某个}地方。但是 - 我忘记关闭 ns1 了吗?或者也许是ns2?我不记得了——它们离我感兴趣的线很远。所以我想插入一些神奇的东西,它会告诉我我现在所在的命名空间。好吧,对于这个例子,我可以写:
namespace ns1 { }\nnamespace ns2 {\nnamespace ns3 {\n\nvoid ns_detector() { return 0; }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n使用 GCC 6.3 时,出现错误:
\n\nb.cpp: In function \xe2\x80\x98void ns2::ns3::ns_detector()\xe2\x80\x99:\nb.cpp:5:29: error: return-statement with a value, in function returning \'void\' [-fpermissive]\n void ns_detector() { return …Run Code Online (Sandbox Code Playgroud)