9

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

UNUSED_ALWAYS(someVar);

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

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

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

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

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

我也试过:

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

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

4

3 回答 3

11
(void)x;

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

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

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

工作得很好。

于 2012-08-30T14:23:43.803 回答
5

是的 - 您可以将这种方法用于 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)))

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

于 2012-08-30T14:28:18.683 回答
1

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

#define MY_MACRO   #if _WIN32 

MY_MACRO 不能#if _WIN32编译器展开。

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

#define UNUSED(_var) _var
于 2012-08-30T14:13:18.977 回答