首先,抱歉,如果这是一个显而易见的问题,但我对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 ++的事情。有没有正确的方法来做到这一点?
答案 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
}
这重复了i
为NGRAMS
时不需要{{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。