【问题标题】:using macros to place #ifdef in the code使用宏在代码中放置#ifdef
【发布时间】:2011-08-06 11:43:20
【问题描述】:

我正在尝试做这样的事情

#define VB_S #ifdef VERBOSE
#define VB_E #endif

这样在代码中而不是写

#ifdef VERBOSE
    cout << "XYZ" << endl;
#endif

我会写

VB_S  
    cout << "XYZ" << endl; 
VB_E

这给了我一个编译时错误:程序中出现杂散“#”。

任何人都可以阐明什么是正确的方法

【问题讨论】:

    标签: c++ syntax macros syntax-error


    【解决方案1】:

    您不能将指令放入宏中。 (# 在宏中作为另一种含义——它是字符串化操作符,必须后跟参数 id——但限制比那个含义更早)

    【讨论】:

      【解决方案2】:

      你可以这样做:

      #ifdef VERBOSE
      #define VB(x) x
      #else
      #define VB(x) do { } while (false)
      #endif
      
      
      VB(cout << "foo");
      

      【讨论】:

      • 可以 x 拿任何东西,例如我可能有用于打印矩阵的循环
      • @Akhil:它不会对任何带有 , 嵌入的东西感到高兴 - 你可以只制作 for 循环并使用宏来打印,如果 VERBOSE 编译器可能会优化掉一个不做任何事情的循环未定义。
      • 我的大部分照片都是简单的 cout 的。为了站在同一边,当我有 for 循环和你为更简单的语句提供的技巧时,我将使用显式 ifdef。非常感谢!
      • @Akhil:你可以做的更简单——>把循环的代码放到一个函数中。
      【解决方案3】:

      与 Erik 的回应类似:

      #ifdef VERBOSE
      #define VB(...) __VA_ARGS__
      #else
      #define VB(...) /* nothing */
      #endif
      

      使用variadic macro 的好处是允许在VB() 调用中使用逗号。另外,AFAIK,您可以删除 do...while

      【讨论】:

      • 不幸的是,虽然是正确的,__VA_ARGS__ 在 C++03 中不受支持(我不确定 C++11)。
      • 除了 g++ 和 MSVC(两个最广泛使用的编译器)都接受它。
      【解决方案4】:

      我更喜欢以下:

      #define VERBOSE 1
      // or 0, obviously
      
      if (VERBOSE)
      {
      // Debug implementation
      }
      

      这更易读,因为 VB_S 对普通用户没有任何意义,但 if (VERBOSE) 有意义。

      【讨论】:

      • 我喜欢这个,VERBOSE 可以用作变量(而不是#define),因此可以在运行时通过命令行参数进行更改。无需编译 VERBOSE 和 NON-VERBSOE 版本。
      猜你喜欢
      • 2022-06-29
      • 1970-01-01
      • 2011-10-09
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2019-11-27
      • 2010-11-12
      相关资源
      最近更新 更多