web-dev-qa-db-ja.com

Cの変数名の後のコロン

重複の可能性:
:1、:7、:16、:32など、構造体宣言のコロンはどういう意味ですか?

参考ページのCコードサンプルです。

      signed int _exponent:8;

「8」と「8」自体の前のコロンの意味は何ですか?

24
Eonil

それはビットフィールドです。これはstruct定義でのみ有効であり、システムが整数に8ビットのみを使用することを意味します。

26
EboMike

それはビットフィールドであり、構造のあいまいで誤った特徴です。他の人のコードのビットフィールドを処理するために知っておく必要のある情報を検索するには、これで十分です。独自のコードについては、ビットフィールドを使用しないでください。

編集: Zackが要求したように、ビットフィールドには、独自のビット演算を実行する場合に比べて重大な欠点があり、利点はありません。それらのいくつかを次に示します。

  • 一度にコピー、比較、シリアル化、または逆シリアル化できるのは1つのビットフィールド要素のみです。独自のビット演算を行うことで、一度に単語全体を操作できます。
  • ビットフィールド要素へのポインタを持つことはできません。独自のビット演算を使用すると、より大きなWordへのポインタと、Word内のビットインデックスを「ポインタ」として使用できます。
  • 固定サイズの型を使用し、エンディアンを知っている限り、C構造体をディスクまたはネットワークに直接読み書きすることは、ビットフィールドなしで中途半端に移植可能です。ただし、ビットフィールドを投入すると、特定のCPUアーキテクチャ内であっても、より大きなタイプ内の要素の順序、および使用される合計スペースと配置は、実装に大きく依存します。
  • C仕様には、ビットフィールド要素の符号が予想とは異なることを許可するよりも非常に奇妙なルールがあり、これらを認識している人はほとんどいません。

シングルビットフラグの場合、ビットフィールドの代わりに独自のビット演算を使用するのは非常に簡単です。パックする必要のある大きな値の場合、すべてのビット演算をあちこちに書き出すのが面倒な場合は、いくつかの単純なマクロを記述します。

ビットフィールド 仕様です。

これは、_exponent8からsigned intビットのみを取得することを意味します。これは通常、8ビットより多くを取得します。通常、ビットフィールドは符号なしタイプで使用されます。

IIRC、コンパイラは、8ビットに収まらないものが_exponentに書き込まれた場合に警告します。

3
Arun

そのステートメントが構造内にある場合、 ビットフィールド を意味します。

2
karlphillip