Есть ли в C функциональность __func__ для имен аргументов функции?

StackOverflow https://stackoverflow.com/questions/905999

  •  05-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

Нет, стандарт 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 добавляет немного расширения, как я полагаю, делают другие компиляторы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top