2010-12-27 9 views
2

私は誰かのコードを読んでいます。最初の-On構造体を参照し、2つの異なる方法を参照してください

、彼は第1 -On pwr_cmd.EN1 を入力して内部参照することができ、彼は私がなり、私は第二一方からBitsを除去-if errors.Bits.ERR1 を入力して内部参照することが可能です最初のものと同じ方法で参照することができます:errors.ERR1? - 2人の違いは何ですか?なぜ、あなたは2人の人の間に違いがありますか?ありがとうございました。

typedef union { 
    byte Byte; 
    union { 
     struct { 
      byte EN1 :1; 
      byte EN2 :1; 
      byte EN3 :1; 
      byte EN4 :1; 
      byte :4; 
     }; 
     struct { 
      byte :2; 
      byte EN34 :2; 
      byte :4; 
     }; 
     struct { 
      byte :2; 
      byte EN3r:1; 
      byte EN4r:1; 
      byte :4; 
     }; 

    }; 
} pwr_cmd; 



typedef union { 
    word Word; 
    union { 
     struct { 
      byte ERR1 :1; 
      byte ERR2 :1; 
      byte ERR3 :1; 
      byte ERR4 :1; 
      byte ERR5 :1; 
      byte ERR6 :1; 
      byte ERR7 :1; 
      byte ERR8 :1; 
      byte ERR9 :1; 
      byte DET1 :1; 
      byte DET2 :1; 
      byte FAIL1 :1; 
      byte PWR1 :1; 
      byte PWR2 :1; 
      byte PWR3 :1; 
      byte PWR4 :1; 
     } Bits; 
      nibble4 Nibble4; 
    }; 
} errors; 

答えて

2

これはビットフィールドの例です。「:」が付いた各変数は整数の特定のビット数を表します。このビットフィールドは、コンテキストに応じて同じビット位置の名前を異なるようにするために結合されています。

「ビット4」のような無意味なものではなく意味のある名前をつけることで、明示的にコードの意図を表すために別のメンバーよりアクセスすることができます。

あなたの質問を再読してください.2つの違いは、名前付き構造体を使用し、もう1つは構造体を使用しないことです。最初に、構造体のメンバは名前がないので、構造体のメンバ参照( "。")を使わずにアクセスできます。 2番目のメソッドでは、構造体の名前を持つ構造体を宣言しているため、構造体のメンバ参照が使用されます。私の意見では、2番目の方がはっきりしていますが、最初の方が簡潔です。それはスタイルと好みの問題です。

+0

私は何をしているのか理解していますが、あなたは私の質問に答えなかったのです。 – milan

+1

違いは構文です。いくつかの共用体の一部として必要な場合は、名前付きの構造体を使用します。それ以外の場合は、匿名の構造体を使用します。 – EnabrenTane

+0

@Enabren - あなたはいくつかの組合の一部としてそれを必要とする場合は、名前付きの構造体を使用する必要がありますが、そうでない場合でも、明快にするために名前を付けたままにすることができます。 – Reinderien

関連する問題