2016-12-05 5 views
1

Учитывая следующий код в проекте, я работаю над:GCC __func__ получает оценку в пустую строку

/* Pre-definitions in a pre-definitions file to be included in the project */ 
#ifdef WIN32 
#define __FUNCNAME__ __FUNCTION__ 
#else 
#define __FUNCNAME__ __func__ 
#endif 

/* My definitions */ 
#define MAC() \ 
    MAC1() 

#define MAC1() \ 
    myPrintFunction(__FUNCNAME__) 

/* My print function */ 
void myPrintFunction(const char * functionName) 
{ 
    printf("\n func name: %s \n",functionName); 
} 

/* Macro usage example function */ 
void myFunction() 
{ 
    if (some_condition) 
    { 
     MAC(); 
    } 
} 

Имя функции представлена ​​как пустая строка. Любая идея, почему, и как я могу ее исправить?

Код компилирован и протестирован на компьютере Linux с использованием компилятора GCC.

+0

Вы уверены, что 'some_condition' верно? – freestyle

+2

Нет 'main()'? Отправьте [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – DevSolar

+0

Да, я уверен. Я могу увидеть «\ n func name: \ n», и я также отлаживаю этот код с помощью отладчика и этот код выполняется. – user2162550

ответ

5

Используйте __func__ из коробки. Он был частью стандарта C с C99. Измените настройки компилятора, чтобы использовать по крайней мере этот стандарт.

Обратите внимание, что __func__ является не макро но предопределенной идентификатор, который принимает форму таким образом, чтобы писать его в любом месте в пределах тела функции в точности эквивалентно использования его в этой точке, предварительно написанной

static const char __func__[] = "function-name";

сразу после открытия скобка функции корпус.

Формальное поведение вашего текущего кода: undefined. Любой символ, содержащий два последовательных символа подчеркивания, зарезервирован системой. (. Это включает в себя имена макросов, имена функций и имена переменных)

+0

Я думаю, вы хотели сказать «Любые * макросы», содержащие два последовательных символа подчеркивания ... ». –

+1

Извините, я имел в виду, что это еще сильнее: имя макроса, имя функции и имя переменной – Bathsheba

+0

@TobySpeight: Тогда что, если я назову локальную переменную 'int __func__'? – AndyG

1

Ваш код, представленный дает ожидаемый результат (как только я добавил необходимые и включает в себя основной):

#include <stdio.h> 

#ifdef WIN32 
#define __FUNCNAME__ __FUNCTION__ 
#else 
#define __FUNCNAME__ __func__ 
#endif 

/* My definitions */ 
#define MAC() \ 
    MAC1() 

#define MAC1() \ 
    myPrintFunction(__FUNCNAME__) 

void myPrintFunction(const char * functionName) 
{ 
    printf("\n func name: %s \n",functionName); 
} 

int main() 
{ 
    MAC(); 
} 

Я составил это с помощью gcc -std=c11 -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds без предупреждений.

Вы должны опубликовать полный (но минимальный) пример, который фактически компилируется вместе с используемыми вами флагами компилятора, поскольку что-то обязательно должно отличаться от объяснения описанных вами симптомов.

Кроме того, при написании операторов в качестве макросов вы можете с пользой использовать идиому do {...} while (0), чтобы избежать непредвиденных расширений, изменяющих поток управления.

Смежные вопросы