可以用来打印方法名称的macros/关键字?
__FILE__
和__LINE__
是众所周知的。 自C99以来有一个__func__
。
#include <iostream> struct Foo { void Do(){ std::cout << __func__ << std::endl; } }; int main() { std::cout << __func__ << std::endl; Foo foo; foo.Do(); return 0; }
会输出
main Do
有没有任何macros/关键字会输出方法名称,如Foo::Do
?
Boost具有一个名为BOOST_CURRENT_FUNCTION的特殊实用macros,它隐藏了编译器实现之间的差异。
在实现之后,我们看到有几个macros取决于编译器:
-
__PRETTY_FUNCTION__
– GCC,MetroWerks,数字火星,ICC,MinGW -
__FUNCSIG__
– MSVC -
__FUNCTION__
– 英特尔和IBM -
__FUNC__
– Borland -
__func__
– ANSI C99
- 在GCC上,你可以使用
__FUNCTION__
和__PRETTY_FUNCTION__
。 - 在MSVC上,你可以使用
__FUNCSIG__
和__FUNCTION__
。
在标准的C ++中没有这样的macros,包括我看过的C ++ 0x标准草案。 这会使编译复杂化,因为parsing(必须确定一个函数是什么)预处理后,我怀疑这就是为什么标准中没有什么。
你使用的__func__
是非标准的,尽pipe它显然在你的编译器上工作。
不在标准C ++中(而且__func__
不是C ++的一部分)。 你的实现可能有这样的function,但是你正在使用哪种编译器?
有关MS Visual Studio支持的完整列表,请参阅“ 预定义的macros(C / C ++) ”。
这可能是有用的:
http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html
#include"stdio.h" #include"stdlib.h" int main() { printf("line number is %d .. func name is %s, file name is %s",__LINE__,__PRETTY_FUNCTION__,__FILE__); return 0; }
这是如何在gcc中打印行号,函数名和文件名。