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

h4c*_*k3d 8 c static

#include <stdio.h>
int foo(){
    return 1;
}
int main(void) {
    static int q = foo(); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是相同的链接.这是一个C代码而不是C++.它编译并在C++中运行良好,但不是C.

此代码出现编译错误.有人可以解释为什么会出错?静态成员只能用常量值初始化吗?在C++中,我们需要在声明静态成员后对其进行DEFINE,为什么在C中不需要它?我找不到任何具有类似查询或良好答案的线程.

Ale*_*nze 7

全局变量和静态变量只能使用编译时已知的常量表达式进行初始化.调用foo()函数不构成使用常量表达式.此外,未指定全局变量和静态变量的初始化顺序.通常,调用foo()意味着必须有一定的顺序,因为函数可以合理地期望其他一些变量已经初始化.

IOW,在C中,您的代码之前都没有执行过main().

在C++中有很多方法,但不是在C语言中.


pra*_*pta 5

所有静态变量都是编译时,函数在运行时提供输出,因此您正在使用运行时变量初始化编译时变量,而这是不可能的,因此会产生错误。

另一个示例可能如下

int main()
{
int p=9;
static int x=p;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码也给你编译时错误,原因与上面相同。