#ifdef всередині #define


83

Я намагаюся написати щось подібне:

Чи є спосіб визначити COV_ONтак? Я знаю, що я зробив вище, це неправильно, оскільки я не можу мати #ifdefвсередині #define. ( #не є дозволеним символом у #define). То чи є якесь рішення?


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

Відповіді:


89

Неможливо. Зробіть це навпаки:


21

Просто поверніть:


Дякуємо за Ваш відповідь. Я спробував COV_ON (увімкнено) та COV_ON (вимкнено), але потім з’являється повідомлення про помилку: очікується ')', майже вимкнено. Будь-яке уявлення про проблему.
agent.smith

це струни. Чи потрібно мені використовувати їх як звичайні рядки всередині лапки? На зразок "увімкнено" та "вимкнено".
agent.smith

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

Я спробував це з цитатами, але користі немає. Я вже відкрив нову тему. Повідомте мене, якщо ви вважаєте синтаксис _Pragma неправильним.
agent.smith

14

Це давнє запитання, але воно вимагало актуальної відповіді.

Замість використання вбудованого ifdef всередині макросу ви можете вибірково визначити __VA_ARGS__макрос, щоб зробити те саме

Це має подібну функціональність, як ifdef, за винятком того, що ви отримуєте дужки для розмежування початку та кінця (що у більшості середовищ розроблення середовища не має проблем зі складанням коду). Хоча ви все ще можете використовувати #defineі #ifdefв контексті, #includeне дозволяється. Для того, щоб отримати вбудовані можливості, подібні до #else, ви можете визначити відповідний макрос таким чином:

Лише один із них NO_FOO()/IF_FOOвидасть код.

Добре, це зручний хак, але чи можемо ми зробити це БІЛЬШ корисним, ніж #ifdefs... Булева логіка та конфігурація, можливо? Давайте створимо кілька таблиць правди (і кілька макросів-помічників).

config.h

код. c


Мені подобається ваш стиль (=
étale-cohomology

6

6

Ти не можеш. Але ви можете поміняти місцями #ifdefі #define:


Дякуємо за Ваш відповідь. Я спробував COV_ON (увімкнено) та COV_ON (вимкнено), але потім з’являється повідомлення про помилку: очікується ')', майже вимкнено. Будь-яке уявлення про проблему.
agent.smith

Не знаючи вашого компілятора, нам потрібно було б знати, який очікуваний _Pragmaсинтаксис; як би ви це зробили без макросу?
Сем Хочевар

Я використовую компілятор VC2005 і бачив синтаксис _Pragma в Інтернеті. Я ніколи раніше не використовував #pragma таким способом.
agent.smith

Тоді вам знадобиться стригнути хак. Дивіться це питання та відповідь .
Сем Хочевар

Я думаю, проблема в VC2005. Вони не використовують _Pragma, але використовують __pragma. Я не впевнений, але це виглядає так. Але все-таки я отримую попереджувальну невідому прагму з __pragma.
agent.smith

3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.