c++ - 使用指定的初始化器聚合匿名结构的初始化
问题描述
我正在移植旧版 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 编译“此代码”?
解决方案
通过将嵌套结构移动到联合中的第一个位置并像非匿名结构一样初始化结构,编译g++ -std=gnu++2a -Wall -Wextra
:
union u {
struct
{
int b;
int c;
};
int a;
};
u f = { {.b = 1, .c = 2 } };
应该可以使用s 的定义中的正则表达式来检测struct
s 内的所有匿名 s 。但是我看不到如何使用正则表达式来适当地修改列表初始化。union
union
推荐阅读
- tensorflow - 使用 pysintaller 打包 tflite 运行时时出错
- reactjs - 使用 Laravel-react 的单页应用程序
- wordpress - 提高 wordpress rest api 速度
- javascript - 在 Nextjs 中扩展 React.FC 的默认行为
- reactjs - 使用 react-test-renderer 和 typescript 测试 MUI 菜单组件
- python-3.x - 韦尔奇变换以保持尺寸
- api - 如何使用 Dio 或 http 在 Flutter 中通过 GET 请求发送参数
- c# - asp 页面 url 为空
- python - 为什么使用 BeautifulSoup 找不到和提取 br 标签
- java - 无论我对代码做什么,nextInt() 中的 NoSuchElementException