需要帮助理解C结构吗
我是一个新手,已经开始编写嵌入式系统,我正在使用其他人的代码。然而,有一个结构的定义,我不帮助理解需要帮助理解C结构吗,c,C,我是一个新手,已经开始编写嵌入式系统,我正在使用其他人的代码。然而,有一个结构的定义,我不帮助理解 struct PACKED { uint8_t cmd; uint8_t int_status; uint8_t v[14]; } rx, tx = { cmd : REG_ADDRES | 0x80, }; 如果您能帮助我理解cmd:REG\u ADDRES | 0x80,行,我将不胜感激 提前感谢。行tx={cmd:REG\u ADDR
struct PACKED {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
} rx, tx = { cmd : REG_ADDRES | 0x80, };
如果您能帮助我理解cmd:REG\u ADDRES | 0x80,
行,我将不胜感激
提前感谢。行
tx={cmd:REG\u ADDRES | 0x80,}
所做的是初始化一个名为tx
的PACKED
类型的对象,该对象的第一个变量(即uint8\u t cmd
)被初始化为值REG\u ADDRES | 0x80
(即REG\u ADDRES
和0x80
的按位OR)
在代码中,它与以下内容相同:
struct PACKED
{
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
};
main()
{
struct PACKED tx;
tx.cmd = REG_ADDRES | 0x80;
}
即组合结构类型定义和该类型的两个变量的定义。因此,它与下面的代码相同,只是下面的代码固定为使用C指定的初始值设定项语法:
struct PACKED {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
};
struct PACKED rx; // uninitialized, do not use until initialized elsewhere
struct PACKED tx = { .cmd = REG_ADDRES | 0x80 }; // cmd field initialized with value
注意,上面初始化了整个tx
,没有给出显式值的字段初始化为0
如果你想知道
REG\u ADDRES | 0x80
是什么意思,它是一个简单的整数表达式,使用按位OR进行计算,因此它将位号7设置为1,并从REG\u ADDRES
中提取其他位0..6。基本上,这部分定义了这个变量的内容
它是您使用的编译器的扩展;C99对它的定义略有不同。你会在那里写信的
struct PACKED {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
} rx, tx = { .cmd = REG_ADDRES | 0x80 };
然而,这种声明事物的方式是相当危险的,因为跳过这一点是很危险的,因为实际上只有tx
是初始化的
更好的办法是
// first declare the struct as a type
struct PACKED uart {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
};
struct PACKED uart rx;
struct PACKED uart tx = { .cmd = REG_ADDRES | 0x80 };
C声明
struct
对象并初始化它的方法。IcHo应该避免。在C++中(和C中也是如此),使用该语法是编译器扩展,它不是成员式初始化的标准方式。C++甚至没有成员式初始化。还要注意的是,只有tx
变量被初始化,而不是rx
变量被初始化,这是坏消息的一个好例子PRACTICE@juanchopanza如何知道它不是C++?你能解释吗?如何找到差异?|表示按位OR,和:表示为左侧显示的lhs指定的值:我认为PACKED
是一个使结构压缩的宏,而不是它的名称。@glglglglgl在这种情况下,必须有一个宏压缩的定义。此外,它还必须以不同的方式使用!我认为PACKED
在这里是一个使结构打包的宏,而不是它的名称在旁注中,“没有给出显式值的字段初始化为0”可能取决于编译器和优化选项。答案很好:)@glglgl-Hmm,这是很有可能的。这当然是有道理的。@giant_teapot虽然我无法找出相关的标准代码段,但我相当肯定,对于数组和结构,如果您初始化一个项目,整个项目都将被初始化。