Почему #ifndef __func__ возвращает true?

Следующий код,

#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 что я здесь скучаю?

2

Решение

__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__ содержит подпись типа функции, а также ее голое имя.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]