2

「C」標準__func__は、関数の引数の名前に似たものをサポートしていますか?

4

2 に答える 2

5

いいえ、C99標準には次のものがあります。

6.10.8事前定義されたマクロ名

次のマクロ名は、実装によって定義されます。

__DATE__ 
__FILE__ 
__LINE__ 
__STDC__ 
__STDC_HOSTED__ 
__STDC_MB_MIGHT_NEQ_WC__ 
__STDC_VERSION__ 
__TIME__ 

次のマクロ名は、実装によって条件付きで定義されます。

__STDC_IEC_559__ 
__STDC_IEC_559_COMPLEX__ 
__STDC_ISO_10646__ 

6.4.2.2事前定義された識別子

識別子__func__は、各関数定義の開始中括弧の直後に宣言されているかのように、翻訳者によって暗黙的に宣言されるものとします。

     static const char __func__[] = "function-name";

ここで、function-nameは字句的に囲む関数の名前です。63)

gccは、他のコンパイラーが行うと想像するように、いくつかの拡張機能を追加します。

于 2009-05-25T09:29:08.853 に答える
3

このための迅速で汚い解決策が必要な場合は、このようなプリプロセッサマクロを作成してください...

#define FUNCTION_HEADER(a) a { const char* __func__ = #a;
#define FUNCTION_FOOTER() }

...そしてこのような関数ヘッダーとフッターに使用します(VS 2008でテスト済み):

#include <windows.h>

#define FUNCTION_HEADER(a) a { const char* __func__ = #a;
#define FUNCTION_FOOTER() }

FUNCTION_HEADER( int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) )
    MessageBoxA(0, __func__, __func__, MB_OK);
    return 0;
FUNCTION_FOOTER()

これはあなたが望むように正確に機能するはずですが、それは醜いです。

于 2009-05-25T09:38:54.547 に答える