我对C编程不太熟悉,并尝试将一些代码从C移植/混合到用于ESP32嵌入式设备的C ++项目中。这些库大多是用于嵌入式设备的C语言,我知道这可能会带来一些挑战。该结构在.h文件中定义,我尝试在cpp文件中初始化该结构。
当我找到一个结构,其中包含一个未命名的结构联合时,我遇到了一个问题。逻辑似乎很简单:
typedef struct{
i2c_mode_t mode;
gpio_num_t sda_io_num;
gpio_pullup_t sda_pullup_en;
gpio_num_t scl_io_num;
gpio_pullup_t scl_pullup_en;
union{
struct {
uint32_t clk_speed;
} master;
struct {
uint8_t addr_10bit_en;
uint16_t slave_addr;
} slave;
};
}i2c_config_t;
[尝试通过初始化结构访问其成员时,它抱怨:
“匿名联合成员的指定者只能出现在与该匿名联合相对应的括号中”
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = i2c_gpio_sda,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = i2c_gpio_scl,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = i2c_frequency
};
这可能是一些基本且简单的解决方案,但是知道是什么原因引起的。
[假设是,当我将初始化程序放在CPP文件中时,抱怨开始了,初始化结构时可能需要使用标准C ++。
但是您如何在未命名的联合内部的结构上执行此操作?
似乎您的问题来自union
未命名的事实。尝试以下代码:
typedef struct{
i2c_mode_t mode;
gpio_num_t sda_io_num;
gpio_pullup_t sda_pullup_en;
gpio_num_t scl_io_num;
gpio_pullup_t scl_pullup_en;
union{
struct {
uint32_t clk_speed;
} master;
struct {
uint8_t addr_10bit_en;
uint16_t slave_addr;
} slave;
} u;
}i2c_config_t;
如果您这样做,则以下代码无需任何探测即可工作:
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = i2c_gpio_sda,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = i2c_gpio_scl,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.u.master.clk_speed = i2c_frequency
};