指定初始值设定项不适用于字符数组

问题描述

我正在从事一个物联网项目,并使用 ESP32 作为我设备的微控制器。

这个简单的 C++ 结构体存储了设备的基本状态:

struct DeviceState {
    char UID[12];
    DeviceMode mode;
    DeviceErrorType errorCode;
    char errorReason[256];
    char name[64];
};   // <--- this is line #28

更新:缺少类型

enum DeviceMode {
        DEVICE_MODE_DEFAULT = 0,DEVICE_MODE_SETUP = 1,DEVICE_MODE_WORK = 2,DEVICE_MODE_FAILURE = 4
    };

enum DeviceErrorType {
        DEVICE_OK = 0b00000000,DEVICE_FATAL_ERROR = 0b10000001,DEVICE_INVALID_STATE = 0b00000010,DEVICE_SENSOR_ERROR = 0b00000011
    };

我使用 char 数组而不是 char*/std::string/String,因为这个状态数据将保存在 ESP32 flash 中,我发现 char 数组是一个不错的选择。 我真正想要但有问题的是,如果我想定义一个认的 deviceState(它永远不会改变,并且会在设备重置时被复制到当前状态)

DeviceState defaultDeviceState = {
    .UID = "undefined",.mode = DeviceMode::DEVICE_MODE_SETUP,// just an enum
    .errorCode = DeviceErrorType::DEVICE_OK,// also enum
    .errorReason = "",.name = "noname"
};

我收到以下错误消息:

WebSetupConsts.h: 28:5: error: C99 designator 'UID' outside aggregate initializer
WebSetupConsts.h: 28:5: error: C99 designator 'errorReason' outside aggregate initializer
WebSetupConsts.h: 28:5: error: C99 designator 'name' outside aggregate initializer

WebSetupConsts.h:28: sorry,unimplemented  non-trivial designated initializers not supported
WebSetupConsts.h:28: sorry,unimplemented  non-trivial designated initializers not supported

我理解错误消息,但是对于另一个以 char* 作为成员的不同结构的初始化,这将起作用:

ConnectionData connData = {
        { .mqttServer = "4x.1xx.2xx.2xx" },{ .mqttUsername = "xxxxxxxx" },{ .mqttPassword = "password" },.mqttPort = 1883,{ .wifiSSID = "UPCxxxxxxx" },{ .wifiPassword = "xxxxxxxxxx" }
    };

将 char* 成员包裹在 {} 方括号中有效,但不适用于 char[]。

谁能解释一下,为什么它不适用于 char 数组?有没有办法定义一个具有 char 数组的结构,并使用指定的初始化程序(成员名称)对其进行初始化?

使用不同的初始化也不起作用:

DeviceState defaultDeviceState = {
    "undefined",DeviceMode::DEVICE_MODE_SETUP,DeviceErrorType::DEVICE_OK,"","noname"
};

错误信息是:

WebSetupConsts.h: 28:5: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
WebSetupConsts.h: 28:5: error: invalid conversion from 'const char*' to 'char' [-fpermissive]

那我该如何初始化呢?

最后一个问题是: 如果这不是存储设备状态的最佳方式,那是什么?

我知道我的问题太多了,但我真的很想了解c++,谢谢你的回答。 编译器是: xtensa-esp32-elf-gcc 1.22.0-80-g6c4433a-5.2.0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)