【问题标题】:cross platform macro for silencing unused variables warning用于消除未使用变量警告的跨平台宏
【发布时间】:2012-08-25 06:34:58
【问题描述】:

在将一大段 C++ 代码从 Visual Studio (2008) 移植到 Xcode (4.4+) 时,我遇到如下行:

UNUSED_ALWAYS(someVar);

UNUSED_ALWAYS(x)(通过UNUSED(x))宏扩展为x,这似乎可以很好地使Visual C++ 静音。然而,这对 Clang 来说还不够。

对于 Clang,我通常使用 #pragma unused x 指令。

UNUSED_ALWAYSUNUSED 宏在我控制的人工 windows.h 标头中定义,其中包含许多帮助 Xcode 编译 Windows 内容的实用程序。

有没有办法定义UNUSED(x) 扩展为#pragma unused x?我试过这个,Clang 无法接受:

#define UNUSED(x) #pragma unused(x)

我也试过了:

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

这似乎有效。我错过了什么吗?

【问题讨论】:

  • 有什么理由不直接删除未使用的变量?您可以在 C++ 中省略函数参数列表中的 var 名称。
  • 我不能:在 windows 上编译时使用了该变量。

标签: c++ xcode visual-c++ clang suppress-warnings


【解决方案1】:
(void)x;

很好;一直为我工作。通常不能将宏扩展为 #pragma,尽管通常可以从宏生成稍有不同的 pragma 语法(gcc 和 clang 上的 _Pragma,VisualC++ 上的 __pragma)。

不过,我实际上在 C++ 中不再需要 (void)x,因为您不能简单地为函数参数命名以表明您不使用它:

int Example(int, int b, int)
{
   ... /* only uses b */
}

工作得很好。

【讨论】:

  • 是的,除了参数在某些编译时条件编译指令下使用。此外,我目前面临的情况不是关于参数,而是关于局部变量。最后,我尽量减少干扰,即如果没有必要,不要更改原始源代码,以尽量减少它在另一端被接受的时间(它仍然需要在 Windows 下编译和工作)。
【解决方案2】:

是的 - 您可以将这种方法用于 GCC 和 Clang:

#define MON_Internal_UnusedStringify(macro_arg_string_literal) #macro_arg_string_literal

#define MONUnusedParameter(macro_arg_parameter) _Pragma(MON_Internal_UnusedStringify(unused(macro_arg_parameter)))

虽然我的确实为 clang 定义了 (void) 方法,但 Clang 现在似乎支持上面的 stringify 和 _Pragma 方法。 _Pragma 是 C99。

【讨论】:

  • 我不知道_Pragma 的变化。我想这就是我想要的。
【解决方案3】:

#define#pragma 都是预处理器指令。您不能定义一个宏来扩展为预处理器指令。以下是不正确的:

#define MY_MACRO   #if _WIN32 

MY_MACRO 无法为 编译器 扩展为 #if _WIN32

最好的办法是定义自己的宏:

#define UNUSED(_var) _var

【讨论】:

  • #define UNUSED(_var) _var 不适用于 Clang。它仍将变量报告为未使用。
  • #define UNUSED(_var) if(_var>(_var+1)) {} 或类似的东西。优化器将删除此类虚假指令。
猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 2016-04-30
  • 1970-01-01
  • 2010-12-01
  • 2010-09-25
  • 2011-01-21
  • 2016-07-15
相关资源
最近更新 更多