问题
I have this Objective-C istruction:
NSRange range = NSMakeRange(i, MIN(a, b));
where a
and b
are NSUInteger
s.
MIN()
is the macro defined in the standard NSObjCRuntime.h
header file as:
#if !defined(MIN)
#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
#endif
During the compilation, the LLVM Compiler 4.1 highlights my instruction showing the warning: "Use of GNU statement expression extension".
What does this mean? Is it my fault? If yes, how can I fix it? If not, how can I remove the compiler warning?
回答1:
It’s a late answer, I know, but you can avoid this message by adding -Wno-gnu
to your compiler flags.
(In Xcode 5 I believe you can change this by going to your project’s Build Settings and adding -Wno-gnu
to the “Other C Flags”, which are in the “Apple LLVM 5.0 – Custom Compiler Flags” section.)
回答2:
"Statement expressions" is an extension of the GNU C compiler and allows you to execute a group of statements, returning the value of the last statement:
x = ({
statement1;
statement2;
statement3;
});
In the above example, x
will have the value returned by statement3
.
It is a convenient feature that enables you to have multi-statement macros that can be nested easily into other expressions. It is not, however, defined by any C standard.
回答3:
Statement expressions have been declared.
You can selectively ignore the warning by using pragma codes without changing project settings.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wgnu"
NSRange range = NSMakeRange(i, MIN(a, b));
#pragma GCC diagnostic pop
回答4:
Don't use -Wno-gnu
, that shuts down too many warnings. Instead, use:
-Wno-gnu-statement-expression
来源:https://stackoverflow.com/questions/13087034/warning-use-of-gnu-statement-expression-extension