#ifdef внутри #define


83

Я пытаюсь написать что-то вроде этого:

Есть ли способ дать COV_ONтакое определение ? Я знаю, что то, что я сделал выше, неправильно, так как я не могу использовать #ifdef#define. ( #не разрешенный символ в #define). Так есть ли решение?


1
Все ответы здесь, похоже, опускают использование do {} while(0)(или эквивалент), чтобы избежать пустого оператора; см. мой ответ на связанный дубликат
Роджер Липскомб

Ответы:


89

Невозможно. Сделайте наоборот:


21

Просто переверните его:


Спасибо за ваш ответ. Я попробовал COV_ON (вкл.) И COV_ON (выкл.), Но затем я получаю сообщение об ошибке: error: expected ')', почти нет. Есть идеи о проблеме.
agent.smith 07

они струны. Нужно ли мне использовать их как обычные строки внутри кавычек? Вроде «включено» и «выключено».
agent.smith 07

Это зависит от вашего определения ПОКРЫТИЯ, но я предполагаю, что вам нужно их процитировать. Предлагаю вам задать еще один вопрос по этому новому выпуску.
Филип

Я пробовал использовать кавычки, но бесполезно. Я уже открыл новую тему. Дайте мне знать, если вы считаете, что синтаксис _Pragma неправильный.
agent.smith 07

14

Это старый вопрос, но на него требовался актуальный ответ.

Вместо использования встроенного ifdef в макросе вы можете выборочно определить __VA_ARGS__макрос, который будет делать то же самое.

Он имеет аналогичную функциональность с ifdef, за исключением того, что вы получаете круглые скобки для разграничения начала и конца (что в большинстве IDE не имеет проблем со сворачиванием кода). Хотя вы все еще можете использовать #defineи #ifdefв контексте, #includeэто запрещено. Чтобы получить встроенные возможности, подобные этому #else, вы можете определить соответствующий макрос следующим образом:

Только один из них NO_FOO()/IF_FOOбудет производить код.

Хорошо, это удобный прием, но можем ли мы сделать его БОЛЬШЕ, чем #ifdefs... Булеву логику и конфигурацию? Давайте настроим несколько таблиц истинности (и пару вспомогательных макросов).

config.h

code.c


Мне нравится твой стиль (=
étale-cohomology


6

Ты не можешь. Но вы можете поменять местами #ifdefи #define:


Спасибо за ваш ответ. Я попробовал COV_ON (вкл.) И COV_ON (выкл.), Но затем я получаю сообщение об ошибке: error: expected ')', почти нет. Есть идеи о проблеме.
agent.smith 07

Не зная вашего компилятора, нам нужно знать, каков ожидаемый _Pragmaсинтаксис; как бы вы это сделали без макроса?
Сэм Хосевар 07

Я использую компилятор VC2005 и видел синтаксис _Pragma онлайн. Я никогда раньше не использовал #pragma таким образом.
agent.smith 07

Тогда вам понадобится взломать stringify. Смотрите этот вопрос и ответ .
Сэм Хосевар 07

Думаю, проблема в VC2005. Они не используют _Pragma, но используют __pragma. Я не уверен, но похоже, что это так. Но все же я получаю предупреждение о неизвестной прагме с __pragma.
agent.smith 07

3

Как вы упомянули, невозможно использовать #ifdef в #define. Вместо этого вы должны сделать обратный порядок:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.