我正在移植旧版 C++ 代码以与 GCC 9.2 一起使用。使用 C++20 和 GNU 扩展是有效的选项。
遗留代码大量使用嵌套在 union 中的匿名结构以及具有指定初始化的聚合初始化,例如:
union u
{
int a;
struct
{
int b;
int c;
};
};
u f = { .b = 1, .c = 2 };
此示例执行 compile with clang -std=gnu++2a -Wall -Wextra
,但它没有compile with g++ -std=gnu++2a -Wall -Wextra
:
error: too many initializers for 'u'
由于在代码中应用此类构造的情况很多,因此有必要以自动方式(例如借助正则表达式)对代码应用潜在的更改。 如何通过尽可能少地自动更改代码来使用 GCC 9.2 编译“此代码”?
最佳答案
通过将嵌套结构移动到 union 内的第一个位置并像非匿名结构一样初始化该结构 compiles with g++ -std=gnu++2a -Wall -Wextra
:
union u {
struct
{
int b;
int c;
};
int a;
};
u f = { {.b = 1, .c = 2 } };
应该可以使用union
定义中的正则表达式检测union
内的所有匿名struct
。但我不明白如何使用正则表达式来适本地修改列表初始化。
关于c++ - 使用指定的初始化器聚合匿名结构的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62694003/