警告"使用GNU语句表达式扩展"

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)

在哪里abNSUInteger.

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标准定义的.

  • 谢谢,非常有趣.由于`MIN()`宏是在Apple标题中定义的(我无法明显改变),有一种方法可以在我的代码中抑制此警告? (5认同)

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)

  • pragma 语句将是:`#pragma GCC 诊断忽略“-Wgnu-statement-expression”` (2认同)