【问题标题】:Universally compiler independent way of implementing an UNUSED macro in C/C++在 C/C++ 中实现 UNUSED 宏的通用编译器独立方式
【发布时间】:2011-06-18 13:48:10
【问题描述】:

在实现存根等时,您希望避免“未使用的变量”警告。多年来,我遇到了一些 UNUSED() 宏的替代方案,但从来没有一种被证明适用于“所有”编译器,也没有一种按照标准是密封的。

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

编辑:由于有许多不符合 c 的替代方案的答案,我想澄清一下,我正在寻找一个对 C 和 C++ 都有效的定义,所有风格等等

【问题讨论】:

标签: c++ c macros compiler-warnings


【解决方案1】:

根据this answeruser GMan典型方式是转换为void

#define UNUSED(x) (void)(x)

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

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

【讨论】:

  • 您找到了一个非常完整的答案并选择了最差的建议解决方案?顺便说一句,当 SO 上已经存在答案时,这是一个好兆头,这个问题是骗人的。
  • @Ben:我正在考虑发表类似的评论,但出于宏的意图和目的,我认为这已经足够规范了。 (也就是说,只使用参数而不是表达式。)
  • @GMan:希望变量不是volatile,因为如果是,这个UNUSED 宏实际上会读取它。 (请注意,我在顶级volatile 中看不到函数参数上的任何实用程序,但它可能是volatile T&)。
  • 刚刚在 Visual Studio 2010 Pro SP 1 上尝试了 '(void)(sizeof((x), 0))' 版本,警告级别为 4,并收到警告 C4100“未引用的形式参数”。请注意,经典/坏 '(void)(x)' 没有产生警告。
  • 我很高兴拥有 no-side-effects-for-volatile 功能,但这会在 gcc 4.8.2 上产生警告:warning: left-hand operand of comma expression has no effect [-Wunused-value] #define UNUSED(x) (void)(sizeof((x), 0))
【解决方案2】:

在 C++ 中,只需将名称注释掉即可。

void MyFunction(int /* name_of_arg1 */, float /* name_of_arg2*/)
{
  ...
}

【讨论】:

  • 这是一个仅适用于 C++ 的解决方案。拥有一个同时适用于 C 和 C++ 的解决方案是没有意义的。关键是这适用于 C++ 中的所有编译器/平台。 C 解决方案是独立的。
  • 我不明白你的论点;部分原因是如果您有一个混合了 c 和 c++ 的代码库,您通常希望有一个符合 c 标准的定义(这很常见,尤其是对于年龄较大的代码库或您实现/包装第 3 方 c 层的地方),部分原因是问题最明显在构建 c 代码时 - 一些 c++ 编译器甚至不会抱怨未使用的参数(例如 microsoft)。
  • 您希望将相同的代码编译为 C 和 C++ 的唯一情况是在前向声明(例如标题)中,无论如何此警告都不适用。如果您确实希望函数体同时在 C 和 C++ 中工作,那么您是对的:我的论点不适用。
【解决方案3】:

通用的方法是不要打开警告选项,这些选项会为清晰正确的代码发送垃圾邮件警告。任何在其分析中包含函数参数的“未使用变量”警告选项都是错误,应该被忽略。不要在代码中乱扔丑陋的东西,以使损坏的编译器安静下来。

您也可以尝试向编译器维护者/供应商发送错误报告。

【讨论】:

  • 我实际上在某种意义上同意。但是,即使我不愿将问题转移到维护警告禁用程序上,一些编译器也不支持禁用个别警告。
  • 只要您用于开发的编译器支持禁用个别警告,一切都很好。如果需要,只需禁用您的开发系统以外的系统上的所有警告。当然 gcc 和 MSVC 支持禁用此警告...
  • 此外,所需的行为通常是:“警告,除非另有说明”。如果 void bar(int foo),没有 UNUSED(foo),则不应禁止警告
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
相关资源
最近更新 更多