2012-11-13 56 views
1

是否有一个通用的取消警告,我可以使用?抑制在多个编译器警告建立

的问题是,有次我可以生成使用一个版本的编译器(GCC),然后我有一个使用一些常见的事情,但使用不同的编译器的合作伙伴。所以警告#是不同的。

SUPPRESS_WARNING_BEGIN(NEVER_USED) 
//code 
SUPPRESS_WARNING_END 

那么该文件将有类似::

#if COMPILER_A 
    NEVER_USED = 245 
#endif 

#if COMPILER_B 
    NEVER_USED = 332 
#endif 


#define SUPPRESS_WARNING_BEGIN(x)/
    #if COMPILER_A 
     //Compiler A suppress warning x 
    #endif 

    #if COMPILER_B 
     //Compiler B suppress warning x 
    #endif 

#define SUPPRESS_WARNING_END/
    #if COMPILER_A 
     // END Compiler A suppress warning 
    #endif 

    #if COMPILER_B 
     // END Compiler A suppress warning 
    #endif 

我能想到这样做是做在一个文件中定义一个宏,我会通过一些通用的价值的唯一途径

不知道如果有一个更简单的方法?另外我知道理想情况下我们都会使用相同的编译器,但不幸的是这不是一个选项。只是试图找到最简单的方法来支持这样的事情,并希望上面提到的一种更简单的方法。

谢谢

+9

我认为最简单的方法是编写代码,不会产生:-) – sidyll

+1

打压警告会在编译时禁用它们最简单的方法任何警告(如放下'-Wall'和gcc的朋友)。海湾合作委员会还允许你通过'#编译指示'来转向特定的警告。但是,不同的编译器对不同的事情发出警告也可能是一个优势,因为您可以修复代码*以解决多个问题,而不会对剩余的良性警告产生太大压力。 –

+2

PP代码无效。你不能在定义里有'#'。 – Pubby

回答

3

有没有便携的方式来做到这一点。不同的编译器做它以不同的方式(例如#pragma warning#pragma GCC diagnostic,等等)。

做的最简单,最好的事情就是写代码并不以任何警告级别产生的编译器的警告。

如果你的目标是抑制有关未使用的变量警告,我建议使用宏:

#define UNUSED(x) ((void)sizeof(x)) 
... 
void some_function(int x, int y) 
{ 
    // No warnings will be generated if x is otherwise unused 
    UNUSED(x); 
    .... 
} 

sizeof操作是在编译时进行计算,并投以void不产生任何结果,所以任何编译将优化UNUSED声明变成了一无所有,但考虑要使用的操作数。

GCC也有unused attribute`

// No warnings will be generated if x is otherwise unused 
int x __attribute__((unused)); 
+2

为什么不简单地用'((void)(x))'来定义'UNUSED'? – ouah

+0

是的,这是有道理的。不幸的是,我正在使用那个特定的例子,理想情况下,我将它用于潜在的许多警告,而不仅仅是特定的警告。 – Jtello

+0

@ouah:这也适用。如果你传递了一个带有副作用的表达式(比如调用一个函数),这会有所作为,因为'sizeof'版本不会产生副作用,但除了变量名之外没有任何理由传递任何东西。我想知道是否有办法使它成为一个编译器错误,如果你扩大“UNUSED”以外的任何变量名称... –