通用的编译器独立方式在C/C++中实现UNUSED宏

sha*_*kin 16 c c++ macros compiler-warnings

在实现存根等时,您希望避免使用"未使用的变量"警告.多年来,我遇到过UNUSED()宏的一些替代方案,但从来没有一个被证明适用于"所有"编译器,或者标准是气密的.

或者我们为每个构建平台坚持使用#ifdef块?

编辑:由于非c兼容替代品的许多答案,我想澄清我正在寻找一个对C和C++,所有口味等都有效的定义.

sha*_*oth 32

根据用户GMan回答,典型的方法是投射到:void

#define UNUSED(x) (void)(x)
Run Code Online (Sandbox Code Playgroud)

但是如果x被标记为volatile会强制从变量读取并因此产生副作用,那么几乎保证无操作并抑制编译器警告的实际方法如下:

// use expression as sub-expression,
// then make type of full expression int, discard result
#define UNUSED(x) (void)(sizeof((x), 0))
Run Code Online (Sandbox Code Playgroud)

  • 刚刚在Visual Studio 2010 Pro SP 1上尝试'(void)(sizeof((x),0))'版本,警告级别为4,并收到警告C4100"未引用的形式参数".请注意,经典/坏'(void)(x)'没有产生任何警告. (5认同)
  • 我很高兴有无副作用的易失性功能,但这会在gcc 4.8.2上发出警告:`警告:逗号表达式的左手操作数无效[-Wunused-value] #define UNUSED( x)(void)(sizeof((x),0))` (5认同)
  • 我想我应该+1.:) (4认同)
  • 您找到了一个非常完整的答案,并选择了最糟糕的建议解决方案?顺便提一下,当SO上已有答案时,这是一个好兆头,问题就是骗局. (2认同)