14

gccバイナリ定数の使用法について黙らせようとしています。-pedanticそれらはコードをより読みやすくしますが、私が他の方法で準拠しているものを使用することを妨げます。似たようなスイッチ-fnobinaryconstwarn(manページをしばらく読んだ後は存在しないと思います)を使用するか、

#pragma GCC diagnostic ignored "-pedantic" 

ここで説明するように、短い範囲でペダンティック警告を選択的に無効にするには: 翻訳ユニットの一部のみに対してGCC警告を選択的に無効にしますか? 残念ながら、それはうまくいかないようです。私のオプションは何ですか?

にとって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__ を記述することで、1 つの式内でこのような警告を防ぐことができます。__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 }
};

(もちろん、これは醜いので、これをプリコンパイラ マクロに変更します。しかし、テストでは許容範囲でした。)

于 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 に答える