需要帮助理解C struct

时间:2014-09-08 08:25:32

标签: c

我是一个新手,已经开始编程嵌入式系统,我正在与其他人的代码合作。但是,有一个结构定义我无法理解。

struct PACKED {
        uint8_t cmd;
        uint8_t int_status;
        uint8_t v[14];
    } rx, tx = { cmd : REG_ADDRES | 0x80, };

感谢您了解cmd : REG_ADDRES | 0x80,行的任何帮助。

提前致谢。

3 个答案:

答案 0 :(得分:4)

这是组合结构类型定义,并定义了该类型的两个变量。所以它与下面的代码相同,除了下面的代码被修复为使用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_ADDRES | 0x80是什么意思,它是简单的整数表达式,使用按位OR 进行计算,所以它将第7位设置为1,并取其他位0。 6来自REG_ADDRES,因为他们在那里。

答案 1 :(得分:2)

tx = { cmd : REG_ADDRES | 0x80, };行正在做的是初始化名为tx的{​​{1}}类型的对象,其第一个变量(即PACKED)正在使用该值进行初始化uint8_t cmdREG_ADDRES | 0x80REG_ADDRES的按位OR。

在代码中,它与:

相同
0x80

答案 2 :(得分:2)

基本上,这部分定义了这个变量的内容。

它是您使用的编译器的扩展; 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 };