在C99中,结构数组可以初始化
static struct {char* tag; char* msg;} help_info[] = {[0]={"tag0","msg0"}, [1]={"tag1", "msg1"}};
这在C++中无效。对于包含已定义信息的可迭代对象,复制这种行为的可能替代方案是什么?
C++20向C++添加了指定的初始化程序。与C相比,在几个不同的方向上存在一些限制。在您的案例中,需要注意的主要区别是C++已经收紧了一点类型系统,因此您不能再从字符串文字初始化char *
。
在C中,为了向后兼容性,您可以从字符串文字初始化char *
,但您仍然必须将其视为char const *
——也就是说,如果您试图写入字符串文字,您会得到未定义的行为(在现代机器上,您通常会得到类似于seg错误的东西,这会杀死您的程序(。
C++现在要求您通过显式使用char const *
来认识到这种限制。如果我们更改您的代码以适应:
static struct {char const* tag; char const* msg;} help_info[] =
{[0]={"tag0","msg0"}, [1]={"tag1", "msg1"}};
并将其编译为C++,这非常好。
请注意,还有C中不存在的其他限制(但它们不会影响此代码(。例如,C++要求初始化程序按顺序排列,所以在C中也可以这样做:
static struct {char const* tag; char const* msg;} help_info[] =
{[1]={"tag1", "msg1"}, [0]={"tag0","msg0"}};
因此[1]的初始值设定项在[0]的初始值设置项之前,但在C++中这是被禁止的。
如另一个答案所述:
来自此链接的指定初始化器在C++指定初始化器中不受支持:
注意:乱序指定初始化、嵌套指定初始化、指定初始化器和常规初始化器的混合以及数组的指定初始化在C编程语言中都是支持的,但在C++中是不允许的。
但是,我相信这个代码会满足您的需要。
static struct { const char* tag; const char* msg; } help_info[] = { {"tag0","msg0"}, {"tag1", "msg1"} };
从此链接指定的初始值设定项在C++中不受支持:
注意:指定初始化顺序错误,嵌套指定初始化,指定初始化程序和常规初始化程序的混合初始化程序和指定的数组初始化都是在C编程语言中支持,但在C++中不允许。
我认为,这是不可能的。