需要帮助理解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虽然我无法找出相关的标准代码段,但我相当肯定,对于数组和结构,如果您初始化一个项目,整个项目都将被初始化。