在源代码中部分禁用gcc中的迂腐警告

时间:2013-01-13 14:09:37

标签: c gcc suppress-warnings

我试图让gcc关闭我对二进制常量的使用。它们使代码更具可读性,但阻止我使用我遵守的-pedantic。我想要有一个像-fnobinaryconstwarn或类似的开关(在阅读手册页一段时间后我认为不存在)或者使用

#pragma GCC diagnostic ignored "-pedantic" 

选择性地禁用如此处所述的短暂伸展的迂腐警告: Selectively disable GCC warnings for only part of a translation unit? 不幸的是,这似乎不起作用。 我有什么选择?

clang

#pragma GCC diagnostic ignored "-Wpedantic"

有效,而上面的行没有,但它会为gcc生成错误。

2 个答案:

答案 0 :(得分:9)

来自gcc手册:http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Alternate-Keywords.html#Alternate-Keywords

  

-pedantic和其他选项会导致许多GNU C扩展的警告。您可以通过在表达式之前写入__extension__来防止在一个表达式中出现此类警告。 __extension__除此之外没有任何影响。

我刚用gcc-4.8.2编译了带-Wall -Wextra -Wpedantic的以下块,并且没有打印警告:

static uint8_t shbl[2][9] = {
{ __extension__ 0b11111111,
  __extension__ 0b11111110,
  __extension__ 0b11111100,
  __extension__ 0b11111000,
  __extension__ 0b11110000,
  __extension__ 0b11100000,
  __extension__ 0b11000000,
  __extension__ 0b10000000,
  __extension__ 0b00000000 },
// BLOCK_RIGHT
{ __extension__ 0b11111111,
  __extension__ 0b01111111,
  __extension__ 0b00111111,
  __extension__ 0b00011111,
  __extension__ 0b00001111,
  __extension__ 0b00000111,
  __extension__ 0b00000011,
  __extension__ 0b00000001,
  __extension__ 0b00000000 }
};

(当然这很难看,我会把它改成预编译宏。但是对于测试来说这是可以接受的。)

答案 1 :(得分:1)

也许,你可以使用一个宏,它可以以便携的方式实现你想要的目标。 这是一个简短的例子:

#include <stdio.h>

#define BINARY(N) strtol(#N, 0, 2)

int main()
{
    unsigned int piece = BINARY(10010101);
    printf("%u\n", piece);

    return 0;
}

理论上,gcc应该能够优化对strtol的调用,并且你不会失去可读性。

编辑:似乎gcc现在还没有优化strtol调用。但是,您的性能损失应该可以忽略不计。

干杯!