C++ 聚合初始值设定项在运行时还是编译时有效?

问题描述

TL;DR : 我需要在编译时初始化全局对象,而且我不能使用 constexpr 构造函数。我可以为此任务使用聚合初始值设定项吗?


我知道 C/C++ 聚合初始值设定项可用于像这样初始化对象的公共成员:

MyObj obj = { "object1",3,7.2F };

不久前我发现了它们的存在,我想到了我之前遇到的一个问题。

我有一个类类型的全局对象,我目前正在使用构造函数对其进行初始化:

MyObj obj = MyObj("object1",7.2F);

这个构造函数只用给定的参数设置几个成员。问题是我希望对象的成员已经在应用程序的可执行文件中初始化(如编译时构造函数),但事实并非如此。是的,我已经检查了生成的二进制文件,并且对象的空间已归零。

我不能在构造函数上使用 constexpr,因为我在没有现代 C++ 的情况下工作并且无法升级

这就是为什么我想知道是否可以使用聚合初始值设定项来解决我的问题。


编辑 1 :我忘了提到我正在为 Windows 开发,并且我要初始化的对象具有 __declspec(dllexport)extern "C" 说明符。

解决方法

作为n。 1.8e9-where's-my-share m. 说,术语“编译时”和“运行时”就语言而言毫无意义。他们更有可能关注您正在使用的工具集。

我能在这里给出的最佳答案是“不确定”。聚合初始值设定项的行为不是 C++ 标准的一部分,这意味着它是实现定义的

为了回答我的问题,我最好的选择是切换到现代 C++ 并使用 constexpr 构造函数,或者将我的数据写入 ASM 文件。