抑制多个编译器构建的警告

时间:2012-11-13 19:41:27

标签: c++ c compiler-warnings

我可以使用通用抑制警告吗?

问题是我有时可能使用一个编译器版本(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

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

感谢

1 个答案:

答案 0 :(得分: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语句优化为什么,但考虑操作数为使用。

海湾合作委员会也有unused attribute`

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