【问题标题】:Iterable Designated Initializer Alternative in C++C++ 中的可迭代指定初始化器替代方案
【发布时间】:2021-03-24 03:32:18
【问题描述】:

在C99中,可以初始化结构数组

 static struct {char* tag; char* msg;} help_info[] = {[0]={"tag0","msg0"}, [1]={"tag1", "msg1"}};

这在 C++ 中无效。为包含已定义信息的可迭代对象复制此行为的可能替代方法是什么?

【问题讨论】:

标签: c++ arrays c global designated-initializer


【解决方案1】:

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++ 中这是禁止的。

【讨论】:

  • 感谢您抽出宝贵时间回复。对于我的上下文和这个问题,这个回答可能是最好的。
【解决方案2】:

如另一个答案所述:

从此链接指定的初始化程序在 C++ 中不支持 Designated Initializers:

注意:乱序指定初始化、嵌套指定初始化、指定初始化和正则初始化混合、数组的指定初始化在C编程语言中都支持,但在C++中是不允许的。

但是,我相信此代码将满足您的需求。

static struct { const char* tag; const char* msg; } help_info[] = { {"tag0","msg0"}, {"tag1", "msg1"} };

【讨论】:

  • 此解决方案适用于我的上下文。感谢您抽出宝贵时间回复。
  • 很高兴它有帮助。请将此答案标记为解决问题。它使人们可以花时间回答其他问题,而不是阅读已回答的问题。它还可以让其他人轻松找到相同问题的答案。
【解决方案3】:

从此链接designated-initializer not supported in C++

注意:乱序指定初始化,嵌套指定 初始化,指定初始化器和常规的混合 初始化器和数组的指定初始化都是 在 C 编程语言中支持,但在 C++ 中不允许。

我认为,这是不可能的。

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 2017-10-09
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2013-07-16
    • 2012-10-14
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多