跨平台宏用于静默未使用的变量警告

时间:2012-08-30 13:50:40

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

在将大量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)

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

3 个答案:

答案 0 :(得分:9)

(void)x;

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

尽管如此,我实际上并不需要在C ++中使用(void)x,因为你不能给函数参数指定一个名称来指示你不使用它:

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

完美无缺。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

#define MY_MACRO   #if _WIN32 

对于编译器,MY_MACRO无法扩展到#if _WIN32

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

#define UNUSED(_var) _var