可能重复:
#ifdef inside #define
如何在宏中成功使用“#”字符?当我做那样的事情时,它会尖叫:
#define DO(WHAT) \
#ifdef DEBUG \
MyObj->WHAT() \
#endif \
答案 0 :(得分:48)
你做不到。你必须做这样的事情:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT) do { } while(0)
#endif
do { } while(0)
避免空语句。例如,请参阅this question。
答案 1 :(得分:10)
它尖叫,因为你做不到。
我建议以下作为替代方案:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
答案 2 :(得分:4)
看起来您想要做的事情可以像这样实现,而不会遇到任何问题:
#ifdef DEBUG
# define DO(WHAT) MyObj->WHAT()
#else
# define DO(WHAT) while(false)
#endif
顺便说一下,更好地使用NDEBUG
宏,除非你有更具体的理由不这样做。 NDEBUG
被更广泛地用作宏,意味着无需调试。例如,可以通过定义NDEBUG
来禁用标准assert
宏。您的代码将成为:
#ifndef NDEBUG
# define DO(WHAT) MyObj->WHAT()
#else
# define DO(WHAT) while(false)
#endif
答案 3 :(得分:2)
你可以这样做:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
答案 4 :(得分:2)
怎么样:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif