Предупреждение "Использование расширения выражения выражения 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