Предупреждение "Использование расширения выражения оператора GNU"

У меня есть эта цель Objective-C:

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

где a а также bявляются NSUIntegers.

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
Другие вопросы по тегам