Для отладочного вывода могут использоваться предопределенные имена __PRETTY_FUNCTION__, __FUNCTION__, __func__.
__func__ это неявно объявленный идентификатор, который расширяется в переменную массива символов строки ASCIIZ, где содержится имя функции, из тела которой использовался __func__. Это было добавлено в библиотеку C стандарта C99. Из описания C99 §6.4.2.2/1:
Идентификатор __func__ неявно объявляется транслятором, как если бы сразу после открывающей скобки каждого определения функции была вставлена декларация:
static const char __func__[] = "имя_функции";
..., где имя_функции это имя лексически-охватывающей функции.
Обратите внимание, что __func__ не макрос, и у него нет специального смысла для препроцессинга.
__FUNCTION__ это расширение (не определенное явно в стандарте), поддерживаемое некоторыми компиляторами C (включая gcc и Visual C++).
В общем случае следует использовать __func__, где это поддерживается, а применять __FUNCTION__ следует только если используется компилятор, который не поддерживает __func__ (например Visual C++, который не поддерживает C99, и пока что не поддерживает все фичи C++0x, не обеспечивает обработку __func__).
__PRETTY_FUNCTION__ это расширение gcc, которое почти то же самое, что и __FUNCTION__, кроме функций C++, содержащих имя "pretty", включая сигнатуру функции. В Visual C++ есть подобное расширение __FUNCSIG__ (но не совсем идентичное).
Для нестандартных макросов консультируйтесь с документацией на ваш компилятор. Описание расширений Visual C++ включено в документацию MSDN компилятора C++, см. раздел "Predefined Macros". Документация по расширениям gcc см. в разделе "Function Names as Strings."
[Ссылки]
1. What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__? site:stackoverflow.com. |