Выборочно удалить предупреждающее сообщение GCC

Этот фрагмент кода:

Int32 status;
printf("status : %x", status)

дает следующее предупреждение:

jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'

Я знаю, что я могу избавиться от него, выставив тип, но возможно ли с помощью флага компилятора GCC избавиться от этого типа предупреждения и использовать -Wall?

Ответ 1

Я использовал следующие CFLAGS:

-Wall -Wformat=0

Ответ 2

Если вам нужен этот код для работы переносимый, тогда вы должны указать аргумент в unsigned int, поскольку тип int может иметь другой размер, чем Int32 на некоторых платформах.

Чтобы ответить на вопрос об отключении определенных предупреждений в gcc, вы можете включить определенные предупреждения в gcc с помощью -Wxxxx и отключить их с помощью -Wno-xxxx.

Из Параметры предупреждения GCC:

Вы можете запросить множество конкретных предупреждений с параметрами, начинающимися с -W, например -Wimplicit, чтобы запросить предупреждения о неявных объявлениях. Каждый из этих специальных предупреждений также имеет отрицательную форму, начинающуюся с -Wno-, чтобы отключить предупреждения; например, -Wno-implicit. В этом руководстве перечислены только одна из двух форм, в зависимости от того, что не является значением по умолчанию.

В вашем случае это предупреждение -Wformat

-Wformat
Проверьте вызовы на printf и scanf и т.д., Чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата, и что конверсии, указанные в строке формата, имеют смысл. Это включает стандартные функции и другие, указанные атрибутами формата (см. Атрибуты функции), в printf, scanf, strftime и strfmon (расширение X/Open, а не в стандартах C) (или другие целевые семейства). Какие функции проверяются без заданных атрибутов формата, зависит от выбранной стандартной версии, и такие проверки функций без указанного атрибута отключены на -ffreestanding или -fno-builtin.

Форматы проверяются на функции формата, поддерживаемые GNU libc версии 2.2. К ним относятся все функции ISO C90 и C99, а также функции из спецификации Single Unix и некоторые расширения BSD и GNU. Другие реализации библиотек могут не поддерживать все эти функции; GCC не поддерживает предупреждение о функциях, выходящих за рамки определенных ограничений библиотеки. Однако, если -pedantic используется с -Wformat, будут даны предупреждения о функциях формата, не входящих в выбранную стандартную версию (но не для форматов strfmon, так как они не находятся в какой-либо версии стандарта C). См. Опции "Управление диалектом C.".

Ответ 3

Похоже, что руководство GCC действительно предоставляет способ сделать это с помощью #pragma. (вопреки тому, что говорит Эйден Белл в другом ответе)

http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

например. для -Унициализированного предупреждения, вы можете сделать...

#pragma GCC diagnostic ignored "-Wuninitialized"

... для подавления предупреждения или...

#pragma GCC diagnostic warning "-Wuninitialized"

... рассматривать его как предупреждение (а не ошибку), даже если вы создаете с помощью -Werror.

Ответ 4

Я предполагаю, что вы ищете

#ifdef WIN32
#pragma warning (disable: #num of the warning) 
#endif

Эквивалент в GCC....

Вы можете найти такие параметры, как -Wno-conversion -Wno-format-security, которые выполняют здесь работу

http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Warning-Options.html

Но в терминах директивы #pragma:

Цитата из списка рассылки GCC от Google:

В настоящее время GCC не предоставляет объект #pragma, который вы ищете.

Не теряйте надежды! Существуют жизнеспособные альтернативы.

Первый лучший способ исправить код так он больше не выдает предупреждение. Увы, вы заявили, что не можете этого сделать.: - (

ПРИМЕЧАНИЕ. Появляются предупреждения многословие, которое может терпеть ваша команда! [см. ниже]

Следующий лучший способ игнорировать нежелательное предупреждение заключается в последующей обработке вывод GCC на script (например, Perl script), который удаляет конкретное, точное предупреждение, которое вы хотите игнорировать.

Следующий способ игнорировать нежелательные предупреждение - отключить предупреждение для эта единица перевода. -Wno-foozle-mcgoogle, только для этой единицы перевода. Который могучий большой молот. И если предупреждение находится в файле заголовка, это может быть повсеместно проекта, к которому я бы решение после обработки script(при условии, что вы не исправление кода).

В настоящее время нет, нет директивы #pragma для отключения определенных предупреждений. Вместо того, чтобы использовать -Wall, вы можете включить столько предупреждений, сколько можете, минус определенные.

http://www.network-theory.co.uk/docs/gccintro/gccintro_31.html

или исправить код