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