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

Jea*_*uys 8 c++ xcode clang suppress-warnings visual-c++

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

UNUSED_ALWAYS(someVar);
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

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

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

Chr*_*ber 9

(void)x;
Run Code Online (Sandbox Code Playgroud)

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

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

int Example(int, int b, int)
{
   ... /* only uses b */
}
Run Code Online (Sandbox Code Playgroud)

工作得非常好.


jus*_*tin 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)))
Run Code Online (Sandbox Code Playgroud)

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