C: препроцессор в макросах? - PullRequest
3 голосов
/ 07 мая 2011

Есть ли способ использовать ключевые слова препроцессора внутри макроса?Если есть какой-то символ экранирования или что-то еще, я не знаю об этом.

Например, я хочу сделать макрос, который расширяется до этого:

#ifdef DEBUG
    printf("FOO%s","BAR");
#else
    log("FOO%s","BAR");
#endif

из этого:

PRINT("FOO%s","BAR");

Возможно ли это, или я просто схожу с ума (и мне придется каждый раз выводить условное сообщение препроцессора),

Ответы [ 3 ]

6 голосов
/ 07 мая 2011

Вы не можете сделать это напрямую, нет, но вы можете определить макрос PRINT по-разному в зависимости от того, определено DEBUG:

#ifdef DEBUG
    #define PRINT(...) printf(__VA_ARGS__)
#else 
    #define PRINT(...) log(__VA_ARGS__)
#endif
2 голосов
/ 07 мая 2011

Просто сделайте это наоборот:

#ifdef DEBUG
    #define PRINT printf
#else
    #define PRINT log
#endif
0 голосов
/ 07 мая 2011

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

#ifdef DEBUG
# define DEBUG_PRINT printf
#else
# define DEBUG_PRINT log
#endif

Если у вас есть переменные макросы, вы можете вместо этого сделать #define DEBUG_PRINTF(...) func(__VA_ARGS__).В любом случае работает.Второй позволяет вам использовать указатели на функции, но я не могу себе представить, зачем вам это нужно.

...