2010-02-03 83 views
38

__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 

是否有宏/关键字像Foo::Do那会输出方法的名字吗?

+1

无法决定最佳答案。我点了点东西,然后向其他人道歉:-)。 – Notinlist 2010-02-03 14:58:16

+0

相关:http://stackoverflow.com/questions/4384765/whats-the-difference-between-pretty-function-function-func – 2016-02-18 12:56:17

回答

72

Boost有一个特殊的实用程序宏叫做BOOST_CURRENT_FUNCTION,它隐藏了编译器实现之间的差异。

继它的实现,我们看到有依赖于编译器的几个宏:

  • __PRETTY_FUNCTION__ - GCC,Metrowerks公司,数字火星,国际商会,MinGW的
  • __FUNCSIG__ - MSVC
  • __FUNCTION__ - Intel和IBM
  • __FUNC__ - Borland
  • __func__ - ANSI C99
+0

+1,用于呈现可在多个平台上工作的解决方案 – 2010-02-03 15:26:01

+2

@Matthieu,感谢Boost为:) – 2010-02-03 15:27:51

+0

+1。这是一个很好的解决方案。我还没有发现。 – 2010-02-03 15:33:06

1

不在标准C++中(而且__func__不是C++的一部分)。你的实现可能有这样的功能 - 你使用的是哪种编译器?

+0

我也对g ++和MSVC++感兴趣。 – Notinlist 2010-02-03 14:53:15

1

有关MS Visual Studio支持的完整列表,请参阅“Predefined Macros (C/C++)”。

+0

那个文档现在在这里:https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros – 2018-02-14 22:03:52

6
  • 在GCC可以使用__FUNCTION____PRETTY_FUNCTION__
  • 在MSVC上,您可以使用__FUNCSIG____FUNCTION__
+0

'__PRETTY_FUNCTION__'真棒!稍后将测试'__FUNCSIG__'。 – Notinlist 2010-02-03 14:52:06

3

在标准C++中没有这样的宏,包括我看过的C++ 0x标准草案。这会使编译复杂化,因为预处理之后解析(确定函数是什么是必需的),我怀疑这就是为什么标准中没有任何内容。

您使用的__func__是非标准的,虽然它显然适用于您的编译器。

+0

这当然是无稽之谈,因为它可以插入实现定义的运行时功能。预处理器字符串concatanation然后不可能,但它不允许其他预处理器符号。 – Lothar 2015-01-18 02:41:48

0

这可能是有用的:

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的行号,函数名和文件名。