Выборочно удалить предупреждающее сообщение 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 ответа:
Если вам нужно, чтобы этот код работал переносимо, то вы должны привести аргумент к 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.
Я предполагаю, что вы ищете
#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
Или исправить код