gpt4 book ai didi

c++ - 导致 "non-trivial designated initializers not supported"错误的结构成员顺序

转载 作者:太空狗 更新时间:2023-10-29 21:39:07 29 4
gpt4 key购买 nike

以前看过herehere

我有以下结构:

struct myStruct {
long int mem0;
int mem1;
int mem2;
// -- Place 1 --
short int sh;
-- Place 2 --
char array[5];
// -- Place 3 --
};

我尝试按如下方式初始化它:

struct myStruct ms1 = {
mem0 : 124,
mem1 : 120,
mem2 : 99,
mem3 : 12,
}; // Line 36

如果我将以下任何一行放在位置 2 或位置 3

    char      mem3;
int mem3;

我收到以下错误:

Azulejo-Main-Engine-1v2-4% g++ test2.cpp -o test2
test2.cpp: In function ‘int main()’:
test2.cpp:36:5: sorry, unimplemented: non-trivial designated initializers not supported
};
^
Azulejo-Main-Engine-1v2-4%

但是,如果我将它放在位置 1,我的程序会编译(并按预期执行)。你能解释一下为什么会这样吗?

我正在尝试将 C 代码移植到 C++ 中。如何防止这种错误?我无法控制代码使用的结构声明。

Azulejo-Main-Engine-1v2-4% g++ --version
g++ (GCC) 5.2.0

最佳答案

"sorry, unimplemented: <...>"始终意味着编译器尚未更新以允许这样做。这与将来是否允许,标准是否允许,甚至是否有意义无关。

如评论中所述,这不是有效的 C++,这是一个编译器扩展。您可以通过限制自己使用有效的 C++ 来避免此类问题。如果您将 -pedantic 传递给它,GCC 将诊断这个和许多其他扩展。旗帜。如果您将 -pedantic-errors 传递给它,它会将此类扩展视为硬错误。旗帜。如果您随后发现您正在编写不可移植的 C++,请更新您的代码以使其可移植,方法是:

struct myStruct ms1 = {
124,
120,
99,
12
};

这需要您放置 mem3mem2 之后, 或通过

struct myStruct ms1 {};
ms1.mem0 = 124;
ms1.mem1 = 120;
ms1.mem2 = 99;
ms1.mem3 = 12;

不需要任何特定位置的 mem3 ,或通过向您的 myStruct 添加构造函数服用mem0 ... mem3作为参数。


有关此扩展复杂性的一些额外细节:

C++ 中的结构初始化通常以字段声明的顺序发生。这使得处理异常变得相当容易:可以以相反的顺序销毁字段。如果尚未构建所有字段,则从最后一个已构建的字段开始销毁。

如果允许以任意顺序初始化字段,那么销毁就会变得复杂。鉴于 struct myStruct ms1 { mem1: f(), mem0: g() }; , 如果 g抛出异常,然后mem1已经初始化,需要销毁,没有 mem0也被破坏,或者编译器重新排列初始化器,意思是 g()f() 之前被调用.前者很难在编译器中得到正确的结果,后者非常不直观。

可以为普通可破坏的字段创建一个特殊的异常(exception),当字段被销毁时不需要运行用户代码,但它尚未实现。

如果你放置 mem3mem2之后, 那么问题就避免了:初始化的顺序与字段顺序完全匹配。

关于c++ - 导致 "non-trivial designated initializers not supported"错误的结构成员顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735608/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com