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

Max*_*Max 13 c gcc suppress-warnings

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

#pragma GCC diagnostic ignored "-pedantic" 
Run Code Online (Sandbox Code Playgroud)

选择性地禁用如此处所述的短暂伸展的迂腐警告:有 选择地仅对部分翻译单元禁用GCC警告? 不幸的是,这似乎不起作用.我有什么选择?

对于 clang

#pragma GCC diagnostic ignored "-Wpedantic"
Run Code Online (Sandbox Code Playgroud)

虽然上面的行没有,但它会产生错误gcc.

Yam*_*ure 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 }
};
Run Code Online (Sandbox Code Playgroud)

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


And*_*tin 1

也许,您可以使用一个宏,它可以以可移植的方式完成您想要实现的任务。这是一个简短的例子:

#include <stdio.h>

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

干杯!