Как подавить отдельные предупреждения в C ++? - PullRequest
1 голос
/ 04 февраля 2010

Прежде всего, извините, если это очевидный вопрос, но я довольно плохо знаком с C ++. Кроме того, этот код изначально не мой, но я пытаюсь его очистить.


Я ищу независимый от компилятора способ подавления предупреждений (предпочтительно) для конкретной строки. У меня есть следующий код:

int MPtag::state_next( int i, int s ){
#if NGRAMS==2
    return s+1;
#elif NGRAMS==3
    return tag_at(i,0) * num_tags + s+1;
#elif NGRAMS>=4
    return tag_at(i,-1) * num_tags*num_tags + tag_at(i,0)*num_tags + s+1;
#endif
}

NGRAMS в настоящее время установлено на 2.

G ++ выдает мне предупреждение (конечно, с соответствующими параноидальными параметрами), что параметр "i" не используется. Хотя это технически верно, это не всегда так. Я думал о том, чтобы закомментировать имя переменной, но тогда, если NGRAMS должен был быть изменен, он произвел бы ошибку компилятора, пока не был закомментирован; что нежелательно.

Самый старый ответ на связанный вопрос предлагает макрос, но другой автор говорит, что он не зависит от компилятора. Я читал о #pragma warning, но AFAICT это VS C ++. Есть ли даже правильный способ сделать это?

Ответы [ 6 ]

7 голосов
/ 04 февраля 2010

Для этого конкретного предупреждения вы всегда можете обмануть:

#define UNREFERENCED_PARAMETER( x ) ( x )

Тогда в вашем коде

int a( int b, int c )
{
    UNREFERENCED_PARAMETER( c );
    return b * b;
}
3 голосов
/ 04 февраля 2010
#if NGRAMS==2
int MPtag::state_next( int, int s ){
    return s+1;
#else
int MPtag::state_next( int i, int s ){
#if NGRAMS==3
    return tag_at(i,0) * num_tags + s+1;
#elif NGRAMS>=4
    return tag_at(i,-1) * num_tags*num_tags + tag_at(i,0)*num_tags + s+1;
#endif
#endif
}

Это подавит ваше предупреждение;)

2 голосов
/ 04 февраля 2010

Самый простой способ, конечно, заставить параметр исчезнуть, когда он не нужен, например, так:

int MPtag::state_next( int
#if NGRAMS != 2
  i
#endif
, int s )
{
#if NGRAMS==2
    return s+1;
#elif NGRAMS==3
    return tag_at(i,0) * num_tags + s+1;
#elif NGRAMS>=4
    return tag_at(i,-1) * num_tags*num_tags + tag_at(i,0)*num_tags + s+1;
#endif
}

Это повторяет «знание», что i не требуется, когда NGRAMS равно двум, но я думаю, что этого достаточно для такого крошечного и сильно локализованного случая.

1 голос
/ 04 февраля 2010

Стандартный способ C ++:

#if NGRAMS==2
int MPtag::state_next( int /*i*/, int s ){
...
#else

Обратите внимание, что это не работает с C. Кроме того, для C GCC имеет атрибут unused.Это, однако, не работает с кодом C ++ (необходимо исправить).

int foo( int __attribute__((__unused__)) i, int s ){
0 голосов
/ 04 февраля 2010

Не существует никакого независимого от компилятора способа, о котором я знаю.
Простое решение - заключить

int MPtag::state_next( int i, int s ){

в # ifdef, тоже.

0 голосов
/ 04 февраля 2010

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

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

...