2010-02-04 98 views
1

首先,很抱歉,如果这是一个明显的问题,但我对C++不太了解。此外,这个代码并不是我的,但我正在尝试清理它。如何在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 
} 

的n-gram当前设置为2

G ++给了我一个警告(当然是在适当的偏执选项),参数“i”是未使用。虽然这在技术上是正确的,但情况并非总是如此。我考虑过注释掉变量名,但是如果NGRAMS被改变,它会产生一个编译错误,直到取消注释;这是不希望的。

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

+0

G ++支持一些msvc扩展名,你应该试试'#pragma warning(disable:nnnn)'其中nnnn是警告编号 – 2010-02-04 09:22:14

+0

我也有问题。我们在这里有代码编译在不同的编译器上(用于嵌入的G ++ 3.x,用于桌面的G ++ 4.x,用于桌面/测试的VC++ 9),并且它们都有不同的警告。 G ++有压缩_some_警告的选项,而在VC++中,每个警告和错误都有一个可以用编译器选项和编译指示压缩的数字代码。我对这种情况不满意。如果您将_treat警告作为errors_启用,则会变得更糟。 – OregonGhost 2010-02-04 09:24:29

+0

@John,在哪里找到警告号码?我的编译器只给了我一些消息,比如“code/MPtag.C:68:warning:unused parameter'i'”? – ArtB 2010-02-04 10:13:52

回答

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 
} 

这重复了“知识”,当NGRAMS是二不需要i,但我认为这样一个小而高度本地化的案例足够好。

+0

虽然其他一些方法可能是“更合适的”,但它们应该在所有文件的共同标题中完成一次,而目前我没有这样做......我喜欢这个答案,因为它的一个不错,一个快速的'一对一'。 – ArtB 2010-02-16 22:22:08

0

由于警告是编译器依赖,所以没有标准的禁止警告方式。

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

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 
} 

这会抑制你的警告;)

7

对于特定的警告,你可以随时欺骗:

#define UNREFERENCED_PARAMETER(x) (x) 

然后在你的代码

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

我使用'#define UNUSED_VAR(x)(x)=(x)',它不会让编译器抱怨没有任何效果的语句 – Hasturkun 2010-02-04 09:28:51

+1

'(void)c; //也会解决它的问题 – LiraNuna 2010-02-04 09:40:48

0

没有编译器独立的方式我知道。
一个简单的解决办法是包裹

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

到的#ifdef了。

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){