7

これは私のビットフィールドです

struct {
    unsigned char v64 : 1;
    unsigned char leg : 7;
} valid;

次に、警告が表示されます。

main.c:17:3: warning: type of bit-field ‘v64’ is a GCC extension [-pedantic]
main.c:18:3: warning: type of bit-field ‘leg’ is a GCC extension [-pedantic]

変更してintも警告はありません。しかし、バイト (unsigned char) のビットフィールドが必要です。

どのように?

4

1 に答える 1

13

gcc -pedantic警告を表示したくない場合は、オプションを削除してください。

C99 では、gccで警告-pedanticが発行されますが、ビット フィールドの実装定義型 ( などunsigned char) を持つことは許可されています。

(C99、6.7.2.1p4) 「ビットフィールドは、_Bool、signed int、unsigned int、またはその他の実装定義型の修飾または非修飾バージョンである型を持つものとします。」

C90 では、 と のみintunsigned int許可signed intされます。

(C90、6.5.2.1) 「ビットフィールドは、int、unsigned int、または signed int のいずれかの修飾または非修飾バージョンである型を持つものとします」

実際、C90 と C99 の両方で、警告は C では必要ありません (これは C90 でのみ未定義の動作ですが、C は未定義の動作に対する警告を必要としません)。警告は、情報提供のみgccを目的として追加されます。-pedantic

于 2012-06-05T23:16:31.593 に答える