C++ 如何无辅助函数直接初始化含结构体指针成员的编译时常量
解决方案
有两种常用方案可以实现需求,分别适用于不同的使用场景:
方案1:使用编译器支持的复合字面量扩展(最简洁)
GCC、Clang、MSVC等主流编译器均支持C风格复合字面量的扩展,可直接通过强制类型转换构造临时数组,获取其指针完成初始化,写法如下:
static const B Barray[] = { { 2, (const A[]){{7, 8}, {9, 10}} }, { 1, (const A[]){{30, 40}} } };
- 该写法生成的数组为静态存储期,生命周期与程序一致,不会出现指针悬空问题
- 仅不属于C++官方标准,属于C标准兼容扩展,对跨编译器兼容性要求不高的场景优先选择
方案2:使用立即调用lambda(完全符合C++标准)
如果需要完全符合C++标准,不依赖任何编译器扩展,可以用立即调用的lambda表达式实现,不需要额外定义全局辅助函数:
// C++17及以上可加constexpr修饰,C++11/14去掉constexpr也可正常工作 static const B Barray[] = { { 2, []() constexpr -> const A* { static constexpr A arr[]{{7,8}, {9,10}}; return arr; }() }, { 1, []() constexpr -> const A* { static constexpr A arr[]{{30,40}}; return arr; }() } };
- lambda内部定义的静态数组作用域仅在lambda内部,不会污染外部命名空间
- 完全符合C标准,所有支持C11及以上的编译器都可以正常编译
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

