12

次のように宣言されたビットフィールドを使用するコードがあります

typedef struct my{
    const char *name;
    uint8_t is_alpha : 1;   
    uint8_t is_hwaccel : 1; 
    uint8_t x_chroma_shift; 
    uint8_t y_chroma_shift; 

} mystr; 

uint8_tに typedef されunsigned charます。

このビット フィールドを使用して MS-VS 2008 でコードをビルドすると、次のような警告が表示されます。

imgconvert.c(60) : 警告 C4214: 非標準の拡張子が使用されています: int 以外のビット フィールド型。
  1. int 以外のタイプのビット フィールドを使用する際に問題や潜在的な問題はありますか? なぜ警告?
  2. C99 の C 言語仕様で許可されている int 型のビット ファイル以外はありますか?
4

3 に答える 3

6

1] int 以外のタイプのビットフィールドを使用する際に問題や潜在的な問題はありますか? なぜ警告?

ビット フィールドは低レベルであるため、非標準型を使用している場合、移植性に問題が生じる可能性があります。したがって、警告 -- これは警告であり、エラーではないことに注意してください。

2] int 型のビットファイル以外は C99 C 言語仕様で許可されていますか?

C99のドラフトから:

6.7.2.1 構造体および共用体指定子

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

于 2010-02-17T12:28:42.517 に答える
2

なぜ使用しないのintですか?ビットフィールドの実際の実装は、コンパイラによって異なります。移植可能なコードを書きたい場合は、 を使用してintください。小さな構造体、固定バイト数の構造体、またはビットが固定位置にある構造体を作成する場合は、ビットフィールドを使用しないでください。uint8_tのようなメンバーを作成し、flagsビットマスクとして使用するマクロを定義します。

于 2010-02-17T16:47:23.687 に答える