Dev*_*Dev 11 compiler-construction cocoa-touch objective-c llvm llvm-4.0
我有这个Objective-C构造:
NSRange range = NSMakeRange(i, MIN(a, b));
Run Code Online (Sandbox Code Playgroud)
在哪里a和b是NSUInteger.
MIN()是标准NSObjCRuntime.h头文件中定义的宏:
#if !defined(MIN)
#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
#endif
Run Code Online (Sandbox Code Playgroud)
在编译期间,LLVM编译器4.1突出显示了我的指令,显示警告:"使用GNU语句表达式扩展".
这是什么意思?这是我的错吗?如果是,我该如何解决?如果没有,我该如何删除编译器警告?
Bla*_*iev 10
"Statement表达式"是GNU C编译器的扩展,允许您执行一组语句,返回最后一个语句的值:
x = ({
statement1;
statement2;
statement3;
});
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,x将返回由返回的值statement3.
这是一个方便的功能,使您可以使用多语句宏,可以轻松嵌套到其他表达式中.但是,它不是由任何C标准定义的.
bde*_*ham 10
我知道,这是一个迟到的答案,但您可以通过添加-Wno-gnu到编译器标志来避免此消息.
(在Xcode 5中,我相信您可以通过转到项目的构建设置并添加-Wno-gnu到"其他C标志" 来更改此项,这些内容位于"Apple LLVM 5.0 - 自定义编译器标志"部分中.)
小智 6
不要使用-Wno-gnu,这会关闭太多警告。相反,使用:
-Wno-gnu-statement-expression
Run Code Online (Sandbox Code Playgroud)