首页 > 解决方案 > 使用灵活数组初始化结构

问题描述

我认为这是一个简单的问题,但我自己无法得到答案。我有一个这样的结构,想要初始化一个命令数组。

typedef struct LPWA_COMMAND
{
    LPWA_COMMAND_TYPE type;
    const char text[];

}LPWA_COMMAND;

LPWA_COMMAND_TYPE 只是一个简单的枚举。别介意。

我不想给出text一个固定的大小,比如:const char text[30],因为我在编译程序之前知道每个命令,这会浪费内存。

因为有可能做到这一点:const char text[] = "Hi";必须有一个类似的解决方案。

这有效:

LPWA_COMMAND test = {
        LPWA_EXTRA, "ATI"
};

但这给了我一个错误:(在嵌套上下文中初始化灵活数组成员)

LPWA_COMMAND test2[1] = {
        {LPWA_EXTRA, "ATI"}
};

顺便说一句:LPWA_COMMAND 必须是 typedef。

谢谢!

标签: cstruct

解决方案


感谢 FelixG、Groo 和 Jabberwocky 的建议。

我现在已经像这样解决了我的问题:

typedef struct LPWA_COMMAND
{
    LPWA_COMMAND_TYPE type;
    const char *text;

} LPWA_COMMAND;

typedef enum LPWA_COMMAND_ID
{
    ATI = 0,
    QPING,
    QPOWD,
    // ... more commands ...
    NUMBEROFCOMMANDS
} LPWA_COMMAND_ID;

LPWA_COMMAND commandset[NUMBEROFCOMMANDS]= {
         [ATI].text = "ATI", [ATI].type = LPWA_EXTRA ,
         [QPING].text = "QPING", [QPING].type = LPWA_NORMAL ,
         [QPOWD].text = "QPOWD", [QPOWD].type = LPWA_NORMAL
         // ... more commands ...
};

也可以在单独的函数中进行初始化,就像 Groo 建议的那样:

LPWA_COMMAND create_command(const char * text, LPWA_COMMAND_TYPE type )
{
    return (LPWA_COMMAND){ .text = text , .type = type};
}

推荐阅读