Вопрос:

#define FOO (x) bar, x никогда не упоминается в определении, что происходит?

c-preprocessor

154 просмотра

6 ответа

687 Репутация автора

Я нашел старый код с чем-то похожим на следующее. Скажем, у меня есть следующее определение:

#define FOO(x) bar

х никогда не упоминается в определении. Значит ли это, что любой текст, помещенный в FOO (), не имеет значения?

Код, на который я смотрю, разбросан по таким вызовам, как FOO(someValue);я предполагаю, что препроцессор просто заменяет весь оператор на barчто бы то ни было someValue? Немного скинуло, почему xвообще присутствует.

Автор: schumacher574 Источник Размещён: 22.08.2016 08:20

Ответы (6)


0 плюса

113270 Репутация автора

Этот оператор просто использует xвыражение, не используя его.

Например, если вы хотите заглушить некоторые методы, вы можете использовать это.

Автор: Jean-François Fabre Размещён: 22.08.2016 08:24

5 плюса

12737 Репутация автора

Решение

Да, FOO(whatever)полностью заменено barна ваш пример.

Такие макросы часто встречаются в «настраиваемом» коде, например:

#if defined(ENABLE_DEBUG_PRINT)
#define DEBUG_PRINT(msg) printf("Here's a message: %s\n", msg)
#else
#define DEBUG_PRINT(msg) /* empty */
#endif
Автор: Daniel Jour Размещён: 22.08.2016 08:24

2 плюса

40778 Репутация автора

То, что происходит, именно то, что вы думали, что произойдет - значение игнорируется. Я рекомендую запустить препроцессор ( gcc -Eили cpp(возможно, добавить -x c++для c ++)), чтобы увидеть, что на самом деле происходит в вашей реализации, вместо того, чтобы просто гадать.

Автор: PSkocik Размещён: 22.08.2016 08:24

4 плюса

204383 Репутация автора

Ничего особенного не происходит. Любое вхождение xв определении макроса расширяется до значения соответствующего аргумента при раскрытии макроса. Если такого вхождения нет, оно не раскрывается (и фактическое значение аргумента не имеет значения).

Что касается того, почему он существует, то может быть, что некоторая прошлая или потенциальная будущая версия макроса может использовать аргумент. Возможно, это один из нескольких макросов, которые принимают один аргумент, и он определен таким образом для согласованности. Невозможно сказать без большего контекста. Но определение макроса совершенно верно.

Автор: Keith Thompson Размещён: 22.08.2016 08:25

1 плюс

22624 Репутация автора

Значит ли это, что любой текст, помещенный в FOO (), не имеет значения?

Если нет условно скомпилированной альтернативной версии, FOO()где xфактически используется. xНапример, вы можете оценить только выражение в отладочной сборке.

Автор: Mud Размещён: 22.08.2016 08:25

2 плюса

97663 Репутация автора

Да, макрос FOO()расширяется до barнезависимо от его аргумента. По своей природе это не отличается от того, как функция может игнорировать некоторые или все свои параметры.

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

Автор: John Bollinger Размещён: 22.08.2016 08:28
Вопросы из категории :
32x32