Предупреждение "Использование расширения выражения выражения GNU"
У меня есть это Objective-C istruction:
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 Compiler 4.1 выделяет мою инструкцию с предупреждением: "Использование расширения выражения выражения GNU".
Что это значит? Это моя вина? Если да, как я могу это исправить? Если нет, как я могу удалить предупреждение компилятора?
Ответы
Ответ 1
Его поздний ответ, я знаю, но вы можете избежать этого сообщения, добавив -Wno-gnu
в свои флагов компилятора.
(В Xcode 5 я считаю, что вы можете изменить это, перейдя к вашим проектам Build Settings и добавив -Wno-gnu
в "Other C Flags", которые находятся в разделе "Apple LLVM 5.0 - флаги пользовательского компилятора". )
Ответ 2
"Выражения операторов" - это расширение компилятора GNU C и позволяет выполнять группу операторов, возвращая значение последнего оператора:
x = ({
statement1;
statement2;
statement3;
});
В приведенном выше примере x
будет иметь значение, возвращаемое statement3
.
Это удобная функция, которая позволяет вам иметь макросы с несколькими утверждениями, которые легко вставляются в другие выражения. Однако это не определяется любым стандартом C.
Ответ 3
Объявлены выражения выражения.
Вы можете выборочно игнорировать предупреждение с помощью прагма-кодов без изменения настроек проекта.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wgnu"
NSRange range = NSMakeRange(i, MIN(a, b));
#pragma GCC diagnostic pop