Проверяю ли я наличие макро-функции с паренсом или без него?

Прежде чем определить макрос-функцию, я могу проверить, что она еще не существует
(это позволяет избежать перезаписи предыдущего определения).

Я могу реализовать проверку и определение следующим образом:

#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)
             ^

Это дает предупреждение.

Другие вопросы по тегам