Следующий код,
#include <iostream>
#ifndef __func__
# ifdef __FUNCTION__
# define __func__ __FUNCTION__
# else
//# error This compiler supports neither __func__ nor __FUNCTION__
# endif
#endifint main(int argc, char **argv)
{
std::cout << __func__ << std::endl
<< __FUNCTION__ << std::endl
<< __PRETTY_FUNCTION__ << std::endl;
}
дает следующий ожидаемый результат,
main
main
int main(int, char**)
Однако, если я раскомментирую else
компиляция не удалась, потому что ни __func__
ни __FUNCTION__
определены. Как это может быть? Они четко определены, как видно на выходе выше. Есть ли какой-то простой принцип относительно #ifdef
/#ifndef
что я здесь скучаю?
__func__
это не макрос. Это магическая переменная, как и __FUNCTION__
а также __PRETTY_FUNCTION__
,
От https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Function-Names.html:
GCC предоставляет три магические переменные, которые содержат имя текущей функции в виде строки. Первый из них
__func__
, который является частью стандарта C99:Идентификатор
__func__
неявно объявляется переводчиком, как если бы, сразу после открывающей скобки каждого определения функции, объявлениеstatic const char __func__[] = "function-name";
…
__FUNCTION__
это другое имя для__func__
,…
В С,
__PRETTY_FUNCTION__
это еще одно имя для__func__
, Однако в C ++__PRETTY_FUNCTION__
содержит подпись типа функции, а также ее голое имя.
Других решений пока нет …