2009-05-29 3 views
14

Этот фрагмент кода:Выборочно удалить предупреждающее сообщение НКУ

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

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

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

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

+0

Возможно, вы действительно должны включить '', а затем' printf ("status:%" PRIx32, status) ', а также сначала преобразовать в беззнаковое целое число. –

+0

Также, если вы можете, попробуйте использовать стандартные типы 'intX_t' из' ', если вы пишете новый код, кто-нибудь читает. –

ответ

8

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

-Wall -Wformat=0 
+0

Никогда не было этого требования, но я вижу, что он удобен :) –

3

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

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

Эквивалент в НКУ ....

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

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

Но с точки зрения директивы #pragma:

Цитирую ССАГПЗ список рассылки от Google:

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

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

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

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

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

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

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

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

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

+0

Неверно в соответствии с руководством GCC: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html –

+0

"или исправить код" +1 –

42

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

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

От GCC Warning Options:

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

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

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

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

+0

Не отвечает на вопрос: как можно отключить определенное предупреждение, обычно включенное в -Wall без отключения -Wall? Или это невозможно? –

+0

@AaronCampbell: '-Wall -Wno-format' отключает предупреждения формата, включенные' -Wall'. –

19

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

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

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

#pragma GCC diagnostic ignored "-Wuninitialized" 

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

#pragma GCC diagnostic warning "-Wuninitialized" 

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

+2

Возможно, на момент написания этого не было. Я смотрю руководство 4.1.2, и в этом он не поддерживается. – mjs