我有这个 Objective-C 指令:
NSRange range = NSMakeRange(i, MIN(a, b));
其中
a
和 b
是 NSUInteger
s。
MIN()
是标准 NSObjCRuntime.h
头文件中定义的宏:
#if !defined(MIN)
#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
#endif
在编译过程中,LLVM 编译器 4.1 突出显示我的指令,显示警告:“使用 GNU 语句表达式扩展”。
这是什么意思?是我的错吗?如果是,我该如何修复它?如果没有,如何消除编译器警告?
“语句表达式”是 GNU C 编译器的扩展,允许您执行一组语句,并返回最后一条语句的值:
x = ({
statement1;
statement2;
statement3;
});
在上面的示例中,
x
将具有 statement3
返回的值。
这是一个方便的功能,使您能够拥有可以轻松嵌套到其他表达式中的多语句宏。然而,它并未由任何 C 标准定义。
我知道这是一个迟到的答案,但您可以通过将
-Wno-gnu
添加到编译器标志来避免此消息。
(在 Xcode 5 中,我相信您可以通过转到项目的“构建设置”并将
-Wno-gnu
添加到“其他 C 标志”(位于“Apple LLVM 5.0 – 自定义编译器标志”部分中)来更改此设置。)
不要使用
-Wno-gnu
,它会关闭太多警告。相反,使用:
-Wno-gnu-statement-expression
语句表达式已声明。
您可以使用编译指示代码有选择地忽略警告,而无需更改项目设置。
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wgnu"
NSRange range = NSMakeRange(i, MIN(a, b));
#pragma GCC diagnostic pop