8
#include <stdio.h>
int foo(){
    return 1;
}
int main(void) {
    static int q = foo(); 
    return 0;
}

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

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

4

3 回答 3

7

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

IOW,在 C 中,您的代码都没有在main().

在 C++ 中有一些解决方法,但在 C 中没有。

于 2012-10-04T04:58:51.440 回答
5

所有静态变量都是编译时,函数在运行时给出输出,所以你用运行时变量初始化编译时变量,这是不可能的,所以它给出了错误。

另一个例子可能如下

int main()
{
int p=9;
static int x=p;
}

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

于 2012-10-04T07:27:17.327 回答
1

如果您在 C 而不是 C++ 中执行此操作,则只能分配编译期间可用的静态变量值。因此不允许使用 foo() ,因为它的值直到运行时才确定。

于 2012-10-04T05:05:25.660 回答