Почему компилятор жалуется на это объявление макроса

Я пишу следующий макрос для удобства отладки,

1 #ifndef DEF_H
2 #define DEF_H
3 #define DEBUG_MODE
4 #define DEBUG_INFO(message)     \
5         #ifdef DEBUG_MODE       \
6                 cout << message << endl; \
7         #endif                          \
8 #endif

но GCC жалуется как следующее

def.h:4: error: '#' is not followed by a macro parameter
def.h:1: error: unterminated #ifndef

Что не так с этим фрагментом кода? Я скучаю по некоторым важным моментам здесь?

3 ответа

Решение

Вы не можете иметь #ifdefs внутри макроопределения. Вы должны вывернуть это наизнанку:

#ifdef DEBUG_MODE
#define DEBUG_INFO(message) cout << (message) << endl
#else
#define DEBUG_INFO(message)
#endif

Вы не можете встроить директиву препроцессора в другую директиву препроцессора (#ifdef DEBUG_MODE внутри определения DEBUG_INFO). Вместо этого сделайте что-то вроде

#ifdef DEBUG_MODE
# define DEBUG_INFO(message) cout << message << endl
#else
# define DEBUG_INFO(message) 0
#endif

(Это все еще не идеально; защитное макро кодирование предполагает что-то вроде

#ifdef DEBUG_MODE
# define DEBUG_INFO(message) do {cout << message << endl;} while (0)
#else
# define DEBUG_INFO(message) 0
#endif

Возможно inline функция будет работать лучше.)

Я думаю, что если вы съедите '\' в строке 7, часть кода будет работать.

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