Проверяю ли я наличие макро-функции с паренсом или без него?
Прежде чем определить макрос-функцию, я могу проверить, что она еще не существует
(это позволяет избежать перезаписи предыдущего определения).
Я могу реализовать проверку и определение следующим образом:
#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif
Или вот так:
#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif
Оба, кажется, работают, когда функция уже определена.
Итак, что правильно? Что является предпочтительным?
2 ответа
Решение
Без.
Стандарт определяет, что #ifndef
эквивалентно #if !defined
и что аргумент defined
должен быть (возможно заключенный в скобки) идентификатор. У вас не может быть паренов в идентификаторе, поэтому defined MACRO(X)
не разрешенная форма Это использование defined
вызывает неопределенное поведение, поэтому оно не переносимо.
Без скобок. По этой причине:
test.c
#ifdef MACRO(x)
#endif
int main() {}
Если вы попытаетесь скомпилировать это:
$ gcc test.c test.c: 2: 13: предупреждение: дополнительные токены в конце директивы #ifdef [включено по умолчанию] #ifdef MACRO(x) ^
Это дает предупреждение.