可能是重复问题:
#define内使用#ifdef
当我尝试在宏中使用"#"字符时,该如何成功地使用呢? 当我做类似以下的事情时,它会报错:
#define DO(WHAT) \
#ifdef DEBUG \
MyObj->WHAT() \
#endif \
可能是重复问题:
#define内使用#ifdef
当我尝试在宏中使用"#"字符时,该如何成功地使用呢? 当我做类似以下的事情时,它会报错:
#define DO(WHAT) \
#ifdef DEBUG \
MyObj->WHAT() \
#endif \
你不能这样做。你必须这样做:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT) do { } while(0)
#endif
do { } while(0)
避免了空语句。例如,可以参考这个问题。
它之所以尖叫,是因为你无法这样做。
我建议以下替代方案:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
#ifdef DEBUG
# define DO(WHAT) MyObj->WHAT()
#else
# define DO(WHAT) while(false)
#endif
顺便提一下,最好使用NDEBUG
宏,除非你有更具体的原因不使用它。 NDEBUG
更广泛地用作表示无调试的宏。例如,标准的assert
宏可以通过定义NDEBUG
来禁用。你的代码将变成:
#ifndef NDEBUG
# define DO(WHAT) MyObj->WHAT()
#else
# define DO(WHAT) while(false)
#endif
NDEBUG
表示无调试,所以 #ifdef
变成了 #ifndef
。 - ilpelle#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
do {} while(0)
结构是我在答案中忘记提到的。 - Oliver CharlesworthMyObj
必须作为参数传递给这些函数,因此它不是一个易于替换的功能。此外,您还必须处理指向成员的指针参数,这可能很快变得丑陋。话虽如此,我实际上并不喜欢使用宏来隐藏正在发生的事情,但问题已经提出了…… - Roger Lipscombe