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

您可以两种方式编写,但您会注意到第一种方式比第二种方式更具可读性,并且由于数据结构在C中非常重要,因此实际上最好以更详细的方式定义它们。

您编写struct声明的方式(每个字段一行,或同一行上相同类型的每个字段)不会影响运行时发生的事情。

内部成员字段的顺序struct非常重要。

填充,或sizeof您的struct,或其对齐方式仅取决于字段及其顺序(以及目标处理器和 ABI),而不取决于您编写它们的方式。

于 2012-11-16T13:09:00.980 回答
1

为什么人们不将相似的成员分组?!

结构是对相似成员的分组。每行声明多个变量只有在它们密切相关时才有用,例如:

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

for或者当您需要在循环中声明多个变量时。

请注意,单独的行更容易阅读。人类在短的、对齐的列(二维)而不是长的行(一维)中读得很好。

内存分配方案会发生什么,除了内存丢失之外,改变成员的顺序是否有任何隐藏的副作用(如果我是对的,由于填充!)。

没有什么我知道的。

于 2012-11-16T13:10:53.120 回答
0

在这里,您将看到标准对填充和内存分配的规定。![这直接来自 ISO C 标准文档][1][1]:http: //i.stack.imgur.com/UzgDY.png

于 2012-11-17T19:04:07.483 回答
0

您的代码唯一有效的是您具有相同的类型(无符号字节)。

这不是最常见的情况+在每个成员的上方或右侧都有评论总是很好的。

于 2012-11-16T13:10:19.883 回答