我写了seen:
静态初始化程序在第一次调用contains函数之前执行;初始化表达式必须是编译时常量。
考虑一下:
void func(){
static float tr=((float) rand() / (RAND_MAX));
}
tr
取决于运行时函数rand()
。我不认为rand()
的值在编译时是已知的,是吗?然而,这在C ++中编译得很好,很多答案/文献表明在这方面C行为与C ++相同。
答案 0 :(得分:6)
在C ++中,在第一次输入范围时执行本地静态初始化,并且表达式根本不需要是常量。你可以调用你喜欢的任何功能。单身人士常见的模式是:例如:
MySingleton& get_instance() {
static MySingleton s;
return s;
}
仅在调用get_instance
函数时(和如果)构造实例。使用C ++ 11,您甚至可以保证,如果可能同时从多个线程调用get_instance
,那么编译器将添加所需的锁定逻辑。
在C中,事情是不同的,并且在程序启动之前由加载程序执行静态初始化,并且您只能使用常量表达式,因此问题中的代码无效(您不能调用rand
)。
答案 1 :(得分:2)
它是有效的C ++,它无效C.
引用来源的问题中的答案是指C的行为,但问题显然是C ++特有的。