__func__
- это неявно объявленный идентификатор, который расширяется до переменной массива символов, содержащей имя функции, когда она используется внутри функции. Он был добавлен в C в C99. От C99 §6.4.2.2 / 1:
Идентификатор __func__
неявно объявляется переводчиком, как если бы, сразу после открывающей скобки каждого определения функции, объявление
static const char __func__[] = "function-name";
Появилось
, где имя-функции - это имя лексической функции. Это имя является неукрашенным именем функции.
Обратите внимание, что это не макрос, и он не имеет особого значения во время предварительной обработки.
__func__
был добавлен в C ++ в C ++ 11, где он указан как содержащий «строку, определяемую реализацией» (C ++ 11 §8.4.1 [dcl.fct.def.general] / 8) , что не так полезно, как спецификация в C. (Первоначальное предложение добавить __func__
в C ++ было N1642 ).
__FUNCTION__
- это стандартное расширение, которое поддерживают некоторые компиляторы C (включая gcc и Visual C ++); в общем, вы должны использовать __func__
там, где это поддерживается, и использовать __FUNCTION__
, только если вы используете компилятор, который его не поддерживает (например, Visual C ++, который не поддерживает C99 и еще не поддерживает все C ++ 0x, не обеспечивает __func__
).
__PRETTY_FUNCTION__
- это расширение gcc, которое в основном совпадает с __FUNCTION__
, за исключением того, что для функций C ++ оно содержит «красивое» имя функции, включая сигнатуру функции. Visual C ++ имеет похожее (но не совсем идентичное) расширение, __FUNCSIG__
.
Для нестандартных макросов вы можете обратиться к документации вашего компилятора. Расширения Visual C ++ включены в документацию MSDN «Предопределенные макросы» компилятора C ++ . Расширения документации gcc описаны на странице документации gcc «Имена функций в виде строк».