可用于打印方法名称的宏/关键字?

时间:2010-02-03 14:39:41

标签: c++ c

__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

6 个答案:

答案 0 :(得分:78)

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

在实现之后,我们看到有几个宏取决于编译器:

  • __PRETTY_FUNCTION__ - GCC,MetroWerks,Digital Mars,ICC,MinGW
  • __FUNCSIG__ - MSVC
  • __FUNCTION__ - 英特尔和IBM
  • __FUNC__ - Borland
  • __func__ - ANSI C99

答案 1 :(得分:8)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分: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中打印行号,函数名和文件名。