c - 使用灵活数组初始化结构
问题描述
我认为这是一个简单的问题,但我自己无法得到答案。我有一个这样的结构,想要初始化一个命令数组。
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。
谢谢!
解决方案
感谢 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};
}