使用函数调用初始化静态变量会产生编译错误?

#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(),因为它的值直到运行时才被确定。