Почему компилятор жалуется на это объявление макроса
Я пишу следующий макрос для удобства отладки,
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 ответа
Решение
Вы не можете иметь #ifdef
s внутри макроопределения. Вы должны вывернуть это наизнанку:
#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, часть кода будет работать.