2

次のような構造を書く代わりに、

typedef struct {
    uint8 len;          // Command length (cmd ... crc)
    uint8 cmd;          // Command code
    uint8 data_length;  // Data length
    uint8 data[12];     // Data: max 12 Byte
    uint8 crc_h;        // CRC value MSB
    uint8 crc_l;        // CRC value LSB
}CMD_TYPE;

このように書けますか?

typedef struct { uint8 len, cmd, data_length, data[12], crc_h, crc_l; }CMD_TYPE;

可能であれば、なぜ人々は同じようなメンバーをグループ化しないのですか?!メモリ割り当てスキームはどうなりますか?また、メモリ損失以外のメンバーの順序を変更することによる隠れた副作用があります(私が正しい場合はパディングが原因です!)。

これがとてもばかげているように思われるなら、私を許してください。

4

4 に答える 4

3

両方の方法で記述できますが、最初の方法の方が2番目の方法よりも読みやすいことに気付くでしょう。また、Cではデータ構造が非常に重要であるため、実際には、より詳細な方法で定義することが望ましいです。

宣言の記述方法struct(フィールドごとに1行、または同じ行の同じタイプのすべてのフィールド)は、実行時に何が起こるかに影響を与えません。

内部のメンバーフィールドの順序structは非常に重要です。

パディング、またはのsizeofstructまたはその配置は、フィールドとその順序(およびターゲットプロセッサとABI)のみに依存し、フィールドの記述方法には依存しません。

于 2012-11-16T13:09:00.980 に答える
1

なぜ人々は同じようなメンバーをグループ化しないのですか?!

構造体は、類似したメンバーをグループ化するものです。行ごとに複数の変数を宣言することは、次のように、それらが強く関連している場合にのみ有効です。

int width, height;
char *begin, *end;

forまたは、ループで複数の変数を宣言する必要がある場合。

別々の行ははるかに読みやすいことに注意してください。人間は、長い線(1次元)ではなく、短く整列した列(2次元)でよく読みます。

メモリ割り当てスキームはどうなりますか?また、メモリ損失以外にメンバーの順序を変更することによる隠れた副作用があります(私が正しい場合はパディングが原因です!)。

私が知っていることは何もありません。

于 2012-11-16T13:10:53.120 に答える
0

あなたのコードが機能する唯一のことはあなたが同じタイプ(符号なしバイト)を持っているということです。

これはほとんどの場合そうではありません+各メンバーの上または右側にコメントがあると常に便利です。

于 2012-11-16T13:10:19.883 に答える
0

ここでは、標準がパディングとメモリ割り当てについて何を言っているかを見ることができます。![これはISOC標準DOCから直接です][1] [1]:http: //i.stack.imgur.com/UzgDY.png

于 2012-11-17T19:04:07.483 に答える