成员函数中的静态初始值设定项需要编译时常量

Static initializer inside member function require compile-time constant?

本文关键字:编译 常量 函数 静态 成员      更新时间:2023-10-16

我看到它写过:

静态初始值设定项在

首次调用包含函数之前执行;初始值设定项表达式必须是编译时常量。

考虑一下:

void func(){
   static float tr=((float) rand() / (RAND_MAX));
}

tr取决于运行时函数,rand() .我不认为rand()的价值在编译时是已知的,是吗?然而,这在C++中编译得很好,许多答案/文献表明 C 行为在这方面与 C++ 相同。

在C++第一次输入作用域时执行本地静态初始化,表达式根本不需要是常量。你可以调用任何你喜欢的函数。单例的常见模式是例如:

MySingleton& get_instance() {
    static MySingleton s;
    return s;
}

其中,只有在(以及如果)调用 get_instance 函数时才会构造实例。使用 C++11,您甚至可以保证,如果编译器将添加所需的锁定逻辑同时从多个线程调用get_instance则不会有问题。

在 C 中,情况有所不同,静态初始化由加载器在程序启动之前执行,您只能使用常量表达式,因此问题中的代码无效(您不能调用 rand )。

它在C++有效,它不是有效的 C。

问题中链接的答案来自哪里是指C的行为,但这个问题显然是特定于C++的。