【问题标题】:Union of Struct inside a Struct - mixing C and C++结构内的结构联合 - 混合 C 和 C++
【发布时间】:2019-11-26 10:11:07
【问题描述】:

我不太熟悉 C 编程,并尝试将一些 C 代码移植/混合到一个名为 ESP32 的嵌入式设备的 C++ 项目中(使用 c99 编译并使用 gcc)。这些库主要是 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++。

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

【问题讨论】:

  • 与编译器错误无关,这是一个非常可疑的联合。考虑改用单独的变量。
  • 我担心位不匹配的事实。为什么在 32 位结构和 24 位结构上都使用联合?这是一个等待发生的内存泄漏/错误
  • 长话短说:Arduino只是这里的一个主要负担,尝试制作一个干净的C项目,所有问题都会消失。
  • 我不确定整个结构是否被转储到设备中。我假设这些值在写入设备之前已在更大的实体中使用。
  • 未使用 Arduino.... 我们正在使用设备供应商提供的库。 C++ 应该可以很好地工作,因为我们已经测试了几个实现。

标签: c++ c esp32


【解决方案1】:

.master = {100000} //在线第一个union可以在c++中设置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多