使用函数调用初始化静态变量会产生编译错误?
#include int foo(){ return 1; } int main(void) { static int q = foo(); return 0; }
这是一个相同的链接。 这是一个C代码而不是C ++。 它在C ++中编译并运行良好,但不是C.
此代码出现编译错误。 有人可以解释为什么会出错? 静态成员只能用常量值初始化吗? 在C ++中,我们需要在声明静态成员后对其进行DEFINE,为什么在C中不需要它? 我找不到任何具有类似查询或良好答案的线程。
全局变量和静态变量只能使用编译时已知的常量表达式进行初始化。 调用foo()
函数不构成使用常量表达式。 此外,未指定全局变量和静态变量的初始化顺序。 通常,调用foo()
意味着必须有一定的顺序,因为函数可以合理地期望其他一些变量已经初始化。
IOW,在C中,你的代码都没有在main()
之前执行。
在C ++中有很多方法,但不是在C.
所有静态变量都是编译时,函数在运行时给出输出,因此您使用运行时变量初始化编译时变量,这是不可能的,因此它给出了错误。
另一个例子可以如下
int main() { int p=9; static int x=p; }
上面的代码也给你编译时错误,原因与上面相同。
如果您在C而不是C ++中执行此操作,则只能分配编译期间可用的静态变量值。 因此,不允许使用foo(),因为它的值直到运行时才被确定。