3

为什么将变量声明为全局变量时,以下代码会返回错误。

int add(int x, int y) {
    return x+y;
}


int ab = add(10, 20);
int main(void) {

    printf("%d", ab);
}

但如果我这样打电话:

int add(int x, int y) {
    return x+y;
}


int main(void) {
    int ab = add(10, 20);  // Variable declare inside main
    printf("%d", ab);
}

然后它执行没有错误。

4

4 回答 4

7

全局变量的初始化器必须是常量,它们不能是任意表达式。

于 2013-05-21T07:59:45.533 回答
5

在 C 语言中,您不能在函数之外的全局范围内执行代码并将函数的返回值存储在全局变量中。

全局变量在初始化时必须保持不变,并且在您执行以下操作时:

x = func ( ... )

函数的返回不是恒定的。

于 2013-05-21T08:00:50.040 回答
3

从第3.5.7节C 标准的初始化:

具有静态存储持续时间的对象的初始化程序或具有聚合或联合类型的对象的初始化程序列表中的所有表达式都应为常量表达式。

并且ab具有静态存储持续时间,但add()不是常量表达式。

于 2013-05-21T08:02:40.310 回答
2

全局变量可以由常量表达式初始化。因为它们的值是在编译时设置的,而不是在运行时设置的

于 2013-05-21T08:08:44.210 回答