我有这个Objective-C istruction:
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语句表达式扩展”。
这是什么意思?这是我的错吗?如果是,我该如何解决?如果没有,我该如何删除编译器警告?
答案 0 :(得分:10)
“Statement表达式”是GNU C编译器的扩展,允许您执行一组语句,返回最后一个语句的值:
x = ({
statement1;
statement2;
statement3;
});
在上面的示例中,x
将包含statement3
返回的值。
这是一个方便的功能,使您可以使用多语句宏,可以轻松嵌套到其他表达式中。但是,它不是由任何C标准定义的。
答案 1 :(得分:10)
我知道,这是一个迟到的答案,但您可以通过在编译器标志中添加-Wno-gnu
来避免此消息。
(在Xcode 5中,我相信您可以通过转到项目的构建设置并将-Wno-gnu
添加到“其他C标志”(位于“Apple LLVM 5.0 - 自定义编译器标志”部分)中来更改此设置。 )
答案 2 :(得分:2)
声明了声明表达式。
您可以在不更改项目设置的情况下使用编译指示代码来有选择地忽略警告。
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wgnu"
NSRange range = NSMakeRange(i, MIN(a, b));
#pragma GCC diagnostic pop
答案 3 :(得分:1)
不要使用-Wno-gnu
,它会关闭太多警告。而是使用:
-Wno-gnu-statement-expression