Struct内部的结构联盟-混合C和C ++

问题描述 投票:0回答:1

我对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 ++。

但是您如何在未命名的联合内部的结构上执行此操作?

c++ c esp32
1个回答
0
投票

似乎您的问题来自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
};
© www.soinside.com 2019 - 2024. All rights reserved.