Выборочно удалить предупреждающее сообщение 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?

4 24

4 ответа:

Если вам нужно, чтобы этот код работал переносимо, то вы должны привести аргумент к 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, а также функции из Единой спецификации Unix и некоторые расширения BSD и GNU. Другие реализации библиотек могут не поддерживать все эти функции; GCC не поддерживает предупреждения о функциях, выходящих за пределы ограничений конкретной библиотеки. Однако, если -pedantic используется с -Wformat, предупреждения будет дана информация о функциях формата не в выбранной стандартной версии (но не для форматов strfmon, так как они не находятся ни в одной версии стандарта C). См. Раздел Параметры Управления Диалектом С.

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

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

Например, для-Wuninitialized предупреждения, вы можете сделать...

#pragma GCC diagnostic ignored "-Wuninitialized"

... чтобы подавить предупреждение, или...

#pragma GCC diagnostic warning "-Wuninitialized"

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

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

-Wall -Wformat=0

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

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

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

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

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

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

Я цитирую из списка рассылки GCC от Google :

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

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

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

Примечание: предупреждения появились как многословно, как ваша команда может терпеть! [см. ниже]

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

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

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

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

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