Выборочно удалить предупреждающее сообщение GCC - PullRequest
33 голосов
/ 29 мая 2009

Этот кусок кода:

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 ]

72 голосов
/ 01 июня 2009

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

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

Из опций GCC Warning :

Вы можете запросить много конкретных предупреждений с опциями, начинающимися -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 диалект.

27 голосов
/ 27 июня 2010

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

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

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

#pragma GCC diagnostic ignored "-Wuninitialized"

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

#pragma GCC diagnostic warning "-Wuninitialized"

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

10 голосов
/ 29 мая 2009

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

-Wall -Wformat=0
2 голосов
/ 29 мая 2009

Полагаю, вы ищете

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

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

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

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

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

...