在将大量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)
这似乎有效。我错过了什么吗?
答案 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