而不是编写像
这样的结构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;
如果有可能那么为什么人们不会将类似成员分组?! 内存分配方案会发生什么,除了内存丢失之外,还有任何隐藏的副作用来改变成员的顺序(如果我是正确的话,由于填充!)。
如果这看起来太傻了,请原谅我。
答案 0 :(得分:3)
你可以写两种方式,但是你会注意到第一种方式比第二种方式更具可读性,并且由于数据结构在 C 中非常重要,实际上最好定义它们以更冗长的方式。
您编写struct
声明的方式(每个字段一行,或同一行中相同类型的每个字段)都不会影响运行时发生的事情。
struct
内的成员字段的顺序非常重要。
填充,或sizeof
的{{1}}或其对齐仅取决于字段及其顺序(以及目标处理器和ABI),而不是您编写它们的方式。
答案 1 :(得分:1)
为什么人们不会将类似的成员分组?!
结构是类似成员的组。每行声明多个变量只有在它们密切相关时才有用,例如:
int width, height;
char *begin, *end;
或者当您需要在for
循环中声明多个变量时。
请注意,单独的行更容易阅读。人类在短的,对齐的列(二维)而不是长线(一维)中读得很好。
内存分配方案会发生什么,也有任何隐藏的副作用,改变成员的顺序,除了内存丢失(由于填充,如果我是对的!)。
我所知道的一切。
答案 2 :(得分:0)
您的代码唯一可行的是您具有相同的类型(无符号字节)。
最常见的情况并非如此+在每个成员的上方或右侧发表评论总是很好。
答案 3 :(得分:0)
在这里,您可以看到标准中有关填充和内存分配的内容。 ![这直接来自ISO C标准DOC] [1] [1]:http://i.stack.imgur.com/UzgDY.png