【发布时间】: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++ 应该可以很好地工作,因为我们已经测试了几个实现。