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

问题描述 投票:0回答:4

我有这个 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 语句表达式扩展”。

这是什么意思?是我的错吗?如果是,我该如何修复它?如果没有,如何消除编译器警告?

objective-c cocoa-touch llvm llvm-4.0
4个回答
12
投票

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

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

在上面的示例中,

x
将具有
statement3
返回的值。

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


11
投票

我知道这是一个迟到的答案,但您可以通过将

-Wno-gnu
添加到编译器标志来避免此消息。

(在 Xcode 5 中,我相信您可以通过转到项目的“构建设置”并将

-Wno-gnu
添加到“其他 C 标志”(位于“Apple LLVM 5.0 – 自定义编译器标志”部分中)来更改此设置。)


10
投票

不要使用

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

-Wno-gnu-statement-expression

2
投票

语句表达式已声明。

您可以使用编译指示代码有选择地忽略警告,而无需更改项目设置。

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

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

#pragma GCC diagnostic pop
© www.soinside.com 2019 - 2024. All rights reserved.