C++ 中的 Iterable Designated Initializer Alternative
Iterable Designated Initializer Alternative in C++
在C99中,可以初始化一个struct数组
static struct {char* tag; char* msg;} help_info[] = {[0]={"tag0","msg0"}, [1]={"tag1", "msg1"}};
这在 C++ 中无效。为包含已定义信息的可迭代对象复制此行为的可能替代方法是什么?
由此link designated-initializer not supported in C++ :
Note: out-of-order designated initialization, nested designated
initialization, mixing of designated initializers and regular
initializers, and designated initialization of arrays are all
supported in the C programming language, but are not allowed in C++.
我想,这不可能。
如另一个答案所述:
来自这个 link C++ 不支持的指定初始化器 Designated Initializers:
注意:乱序指定初始化、嵌套指定初始化、指定初始化和正则初始化混合、数组指定初始化在C语言中都是支持的,但在C++中是不允许的。
不过,我相信这段代码会满足您的需要。
static struct { const char* tag; const char* msg; } help_info[] = { {"tag0","msg0"}, {"tag1", "msg1"} };
C++20 向 C++ 添加了指定的初始化器。与 C 相比,在几个不同的方向上有一些限制。在您的情况下,主要区别在于 C++ 收紧了一些类型系统,因此您不能再从字符串文字初始化 char *
。
在 C 中,为了向后兼容,您可以从字符串文字中初始化 char *
,但您仍然必须将其视为 char const *
-- 也就是说,如果你尝试写入字符串文字,你会得到未定义的行为(在现代机器上,你通常会得到一些类似于段错误的东西,这会杀死你的程序)。
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++ 中这是被禁止的。
在C99中,可以初始化一个struct数组
static struct {char* tag; char* msg;} help_info[] = {[0]={"tag0","msg0"}, [1]={"tag1", "msg1"}};
这在 C++ 中无效。为包含已定义信息的可迭代对象复制此行为的可能替代方法是什么?
由此link designated-initializer not supported in C++ :
Note: out-of-order designated initialization, nested designated initialization, mixing of designated initializers and regular initializers, and designated initialization of arrays are all supported in the C programming language, but are not allowed in C++.
我想,这不可能。
如另一个答案所述:
来自这个 link C++ 不支持的指定初始化器 Designated Initializers:
注意:乱序指定初始化、嵌套指定初始化、指定初始化和正则初始化混合、数组指定初始化在C语言中都是支持的,但在C++中是不允许的。
不过,我相信这段代码会满足您的需要。
static struct { const char* tag; const char* msg; } help_info[] = { {"tag0","msg0"}, {"tag1", "msg1"} };
C++20 向 C++ 添加了指定的初始化器。与 C 相比,在几个不同的方向上有一些限制。在您的情况下,主要区别在于 C++ 收紧了一些类型系统,因此您不能再从字符串文字初始化 char *
。
在 C 中,为了向后兼容,您可以从字符串文字中初始化 char *
,但您仍然必须将其视为 char const *
-- 也就是说,如果你尝试写入字符串文字,你会得到未定义的行为(在现代机器上,你通常会得到一些类似于段错误的东西,这会杀死你的程序)。
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++ 中这是被禁止的。