我有一个相当特殊的 C++14 初始化问题。我正在链接一个提供main(). 该库使用了我要定义的全局数组,如下所示:
extern int array[];
int main(void)
{
for (int i = 0; array[i] != -1; i++) {
printf("%d\n", i);
}
}
Run Code Online (Sandbox Code Playgroud)
预期用途是初始化数组,例如int array[] = {1, 2, 3, -1}。但我希望能够动态初始化它。我使用的是 C++14,所以我的想法是创建一个带有写入数组的构造函数的全局对象,如下所示:
int array[2];
struct Init {
Init() {
array[0] = 1;
array[1] = -1;
}
}
Init init;
Run Code Online (Sandbox Code Playgroud)
但 C++14 标准是这样说的:
具有静态存储持续时间的非局部变量的动态初始化是否在 main 的第一条语句之前完成是实现定义的。如果初始化被推迟到 main 的第一个语句之后的某个时间点,则它应发生在与要初始化的变量相同的翻译单元中定义的任何函数或变量的第一个 odr-use (3.2) 之前。
我是否正确地阅读了这篇文章,有可能当main()运行时,我的对象可能还没有被构造,这意味着我的数组不会被初始化(或者更确切地说,将默认初始化,而不是由我的类初始化)?
如果是这样,有什么办法解决这个问题吗?我无法控制提供main(). 我想要在启动时、main()运行之前设置数组的值是不是运气不好?
它应发生在同一翻译单元中定义的任何函数或变量的第一次 odr-use (3.2) 之前
强调“任何函数或变量”。当然,“变量”部分包括所讨论的全局变量。
换句话说,保证初始化发生在变量的 odr 使用之前。问题解决了。
因此,一旦 C++ 程序中的任何内容朝定义全局数组的翻译单元中的“任何函数或变量”方向打喷嚏,它们就会具体化。
您可以保证在array使用 odr 之前,会进行初始化,因为它位于同一翻译单元中,并且在使用 odr 之前,它将init负责将其成型。array