Why compiler complain about this macro declaration

让人想犯罪 __ 提交于 2019-12-08 23:42:23

问题


I write the following macro for debug convinience,

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

but gcc complains as the following

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

What's wrong with this piece of code? Do I miss some important points here?


回答1:


You cannot have #ifdefs inside a macro definition. You need to turn it inside out:

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



回答2:


You can't embed a preprocessor directive in another preprocessor directive (the #ifdef DEBUG_MODE inside the definition of DEBUG_INFO). Instead, do something like

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

(This is still not ideal; defensive macro coding suggests something like

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

Perhaps an inline function would work better.)




回答3:


I geuss if you eat '\' at line 7, the piece of Code will work.



来源:https://stackoverflow.com/questions/10074520/why-compiler-complain-about-this-macro-declaration

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!