宏中的"#ifdef"

Jas*_*enX 38 c++ c-preprocessor

可能重复:
#ifff在#define中

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

#define DO(WHAT)        \
#ifdef DEBUG        \                           
  MyObj->WHAT()         \       
#endif              \
Run Code Online (Sandbox Code Playgroud)

Rog*_*mbe 52

你不能这样做.你必须做这样的事情:

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT) do { } while(0)
#endif
Run Code Online (Sandbox Code Playgroud)

do { } while(0)避免了空语句.例如,请参阅此问题.

  • +1:“do {} while(0)”构造是我在回答中忘记提及的。 (2认同)
  • 这是使用内联函数而不是宏的一个原因! (2认同)

Oli*_*rth 10

它尖叫,因为你不能那样做.

我建议以下作为替代方案:

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
Run Code Online (Sandbox Code Playgroud)


Pau*_*nta 5

看来你想做的事情可以这样实现,不会遇到任何问题:

#ifdef DEBUG
#    define DO(WHAT) MyObj->WHAT()
#else
#    define DO(WHAT) while(false)
#endif
Run Code Online (Sandbox Code Playgroud)

顺便说一句,最好使用NDEBUG宏,除非你有更具体的理由不这样做。NDEBUG更广泛地用作意味着无需调试的宏。例如,assert可以通过定义禁用标准宏NDEBUG。你的代码将变成:

#ifndef NDEBUG
#    define DO(WHAT) MyObj->WHAT()
#else
#    define DO(WHAT) while(false)
#endif
Run Code Online (Sandbox Code Playgroud)