c++ - 使用指定的初始化器聚合匿名结构的初始化

标签 c++ g++ unions aggregate-initialization anonymous-struct

我正在移植旧版 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/

相关文章:

c++ - (C++) 当只有迭代器可用时查找迭代器的 end()?

c++ - 0x771515ee 处未处理的异常 Microsoft C++ 异常:内存位置 0x0049f904 处的 std::bad_alloc

c++ - 检查进程用户是否是管理员c++

c++ - 为什么我的字符串分配会导致段错误?

java - 从java中的c/c++源代码中提取函数名称

c++ - 为什么 fmod 会产生不同的结果?

OS X 10.8.5 上的 C++ math.h

c++ - 你最喜欢的 g++ 选项是什么?

c++ - 将结构复制(使用赋值)到 union 内的结构导致段错误

c - 使用最高有效位来标记 union 是否被认为是一种不好的做法?