3

我正在尝试学习 C,但在以下代码中出现错误。

如果我在体积中使用半径,则会出现错误:error #2069: Initializer must be constant.

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * radius) );

int main(void){

return 0;
}

但是当我用一个实际的数字改变半径时,它编译得很好。

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * 10) );

int main(void){

    return 0;
}

为什么会发生这种情况,我该怎么做才能使第一个版本正常工作?

4

5 回答 5

5

在 C 中,您不能使用非常量表达式初始化全局变量。

C99 标准:第 6.7.8 节:

具有静态存储持续时间的对象的初始化程序中的所有表达式都应为常量表达式或字符串文字。

在您的示例中,volume是具有静态存储持续时间的全局变量,并且radius不是常量。因此错误。

于 2013-01-19T12:46:21.530 回答
3

在 C 中,您只能使用常量表达式初始化函数外部的变量。 int radius不是常量表达式。

于 2013-01-19T12:44:35.053 回答
3

不能使用非常量表达式初始化静态对象。在你的例子中,

float volume = ( 4.0f / (3.0f * PI * radius) );

volume是一个全局变量,具有静态持续时间。所以它不能用非常量表达式初始化。

但是,如果volume是局部变量,则可以在 C99 中使用非常量值对其进行初始化。因此,在C99.

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;

int main(void){
float volume = ( 4.0f / (3.0f * PI * radius) );
return 0;
}

C90但是在所有初始化器都必须是常量表达式的情况下,这同样是无效的。

于 2013-01-19T12:58:32.397 回答
1

在这方面的常数是没有内存地址的东西。radius有一个内存地址,所以它不能用于初始化。

于 2013-01-19T12:45:01.923 回答
1

它只是 C,而不是 C++,所以radius必须是常量,但如果你想要它作为变量。
定义为volume_main()

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
int main(void){
float volume = ( 4.0f / (3.0f * PI * radius) );
return 0;
}


现在,错误可能会消失。

于 2013-01-19T12:49:16.947 回答