2010-02-03 57 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的行號,函數名和文件名。