宏中的“#ifdef”

时间:2011-08-30 16:26:17

标签: c++ c-preprocessor

  

可能重复:
  #ifdef inside #define

如何在宏中成功使用“#”字符?当我做那样的事情时,它会尖叫:

#define DO(WHAT)        \
#ifdef DEBUG        \                           
  MyObj->WHAT()         \       
#endif              \

5 个答案:

答案 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