14

我试图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.

4

2 回答 2

10

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

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

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

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 }
};

(Of course this is ugly, and I'll change that to a precompiler macro. But for a test it was acceptable.)

于 2013-12-03T07:58:12.963 回答
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 调用。但是,您的性能损失应该可以忽略不计。

干杯!

于 2013-01-13T15:54:05.493 回答