首页 > 解决方案 > 使用指定的初始化器聚合匿名结构的初始化

问题描述

我正在移植旧版 C++ 代码以使用 GCC 9.2。使用 C++20 和 GNU 扩展是有效的选项。

遗留代码大量使用嵌套在联合中的匿名结构和具有指定初始化的聚合初始化,例如:

union u 
{ 
    int a; 
    struct
    {
        int b;
        int c;
    }; 
};
u f = { .b = 1, .c = 2 };

这个例子用 编译clang -std=gnu++2a -Wall -Wextra,但它不能用 编译g++ -std=gnu++2a -Wall -Wextra

错误:“u”的初始化程序太多

由于在代码中应用此类结构的情况很多,因此有必要以自动方式(例如在正则表达式的帮助下)对代码应用潜在的更改。如何通过以自动化方式尽可能少地更改代码来使用 GCC 9.2 编译“此代码”?

标签: c++g++unionsaggregate-initializationanonymous-struct

解决方案


通过将嵌套结构移动到联合中的第一个位置并像非匿名结构一样初始化结构,编译g++ -std=gnu++2a -Wall -Wextra

union u { 
    struct
    {
        int b;
        int c;
    }; 
    int a; 
};
u f = { {.b = 1, .c = 2 } };

应该可以使用s 的定义中的正则表达式来检测structs 内的所有匿名 s 。但是我看不到如何使用正则表达式来适当地修改列表初始化。unionunion


推荐阅读