13

我有这个Objective-C指令:

NSRange range = NSMakeRange(i, MIN(a, b));

在哪里abNSUIntegers。

MIN()是标准NSObjCRuntime.h头文件中定义的宏:

#if !defined(MIN)
   #define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
#endif

在编译期间,LLVM Compiler 4.1 突出显示我的指令,显示警告:“使用 GNU 语句表达式扩展”。

这是什么意思?是我的错吗?如果是,我该如何解决?如果没有,如何删除编译器警告?

4

4 回答 4

11

我知道,这是一个迟到的答案,但您可以通过添加-Wno-gnu编译器标志来避免此消息。

(在 Xcode 5 中,我相信您可以通过转到项目的 Build Settings 并添加-Wno-gnu到“Apple LLVM 5.0 – Custom Compiler Flags”部分中的“Other C Flags”来更改此设置。)

于 2013-12-16T21:28:50.303 回答
10

“语句表达式”是 GNU C 编译器的扩展,允许您执行一组语句,返回最后一条语句的值:

x = ({
    statement1;
    statement2;
    statement3;
});

在上面的示例中,x将具有返回的值statement3

这是一个方便的功能,使您能够拥有可以轻松嵌套到其他表达式中的多语句宏。但是,它不是由任何 C 标准定义的。

于 2012-10-26T12:44:22.157 回答
8

不要使用-Wno-gnu,这会关闭太多警告。相反,使用:

-Wno-gnu-statement-expression
于 2018-08-27T15:57:10.520 回答
2

声明表达式已被声明。

您可以通过使用杂注代码选择性地忽略警告,而无需更改项目设置。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wgnu"

NSRange range = NSMakeRange(i, MIN(a, b));

#pragma GCC diagnostic pop
于 2015-01-03T00:52:30.657 回答