gcc - 在源代码中,c 部分禁用pedantic警告

  显示原文与译文双语对照的内容
87 5

我试图让 gcc 关闭我对二进制常量的使用。他们使代码更加可以读,但是阻止我使用 -pedantic,但是我遵守了否则。我想有一个 switch 像 -fnobinaryconstwarn 或者类似的( 在查看手册页之后,我不认为它存在) 或者使用

#pragma GCC diagnostic ignored"-pedantic" 

要有选择地禁用pedantic警告,如下面描述的那样:选择性地在翻译单元的部分中禁用GCC警告不幸的是,这似乎并不正常。我有什么选择呢?

用于 clang

#pragma GCC diagnostic ignored"-Wpedantic"

行,而上面的行没有,但它为 gcc 生成了一个错误。

时间:原作者:0个回答

80 3

可以能,你可以以使用一个可以以用便携式方式实现的宏。下面是一个简短的例子:

#include <stdio.h>
#define BINARY(N) strtol(#N, 0, 2)
int main()
{
 unsigned int piece = BINARY(10010101);
 printf("%un", piece);
 return 0;
}

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

编辑:似乎gcc并没有像现在一样优化strtol调用。但是,你的性能损失应该可以忽略。

cheers!

原作者:
114 3

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

-pedantic和其他选项会对许多 GNU C 扩展产生警告。你可以在表达式前写入 __extension__,从而防止在一个表达式内出现这样的警告。__extension__除了这里之外没有效果。

我刚编译了以下 block,使用 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 }
};

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

原作者:
...