Имеет ли C функциональность __func__ для имен аргументов функции? - PullRequest
2 голосов
/ 25 мая 2009

Поддерживает ли стандарт "C" что-то похожее на __func__ для имен аргументов функции?

Ответы [ 2 ]

5 голосов
/ 25 мая 2009

Нет, стандарт 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";
Появилось

, где имя-функции - это имя лексической функции.63)

gcc добавляет некоторые расширения , как и другие компиляторы.

3 голосов
/ 25 мая 2009

если вы хотите быстрое и грязное решение для этого, создайте макросы препроцессора следующим образом ...

#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()

Это должно работать именно так, как вы хотите, но это ужасно.

...