如何在C ++中抑制个别警告?

时间:2010-02-04 09:18:50

标签: c++ warnings compiler-warnings

首先,抱歉,如果这是一个显而易见的问题,但我对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,它会产生编译错误,直到取消注释;这是不可取的。

oldest answer for related question提出了一个宏,但另一张海报说它不是编译器独立的。我读过#pragma warning但是AFAICT是VS C ++的事情。有没有正确的方法来做到这一点?

6 个答案:

答案 0 :(得分:7)

对于那个特别警告,你总是可以作弊:

#define UNREFERENCED_PARAMETER( x ) ( x )

然后在你的代码中

int a( int b, int c )
{
    UNREFERENCED_PARAMETER( c );
    return b * b;
}

答案 1 :(得分:3)

#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 :(得分:2)

最简单的方法当然是在不需要时使参数消失,如下所示:

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
}

这重复了iNGRAMS时不需要{{1}}的“知识”,但我认为这对于如此微小且高度本地化的案例来说已经足够了。

答案 3 :(得分:1)

标准的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 ){

答案 4 :(得分:0)

没有标准的抑制警告的方法,因为警告是编译器依赖。

您必须使用特定于编译器的#pragma,或者确保您的代码不会在不同的编译器上生成任何警告,或者只是确保它不会在您正在使用的主编译器上生成警告,并且不要打扰别人。

答案 5 :(得分:0)

我不知道编译器独立的方式。
一个简单的解决方案是包装

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

也加入#ifdef。