我正在尝试学习C,但我在以下代码中收到错误。
如果我在卷中使用 radius ,则会出现错误: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;
}
为什么会发生这种情况,我该怎么做才能使第一个版本有效?
答案 0 :(得分:4)
在C中,您无法使用非常量表达式初始化全局变量。
C99标准:第6.7.8节:
具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。
在您的示例中,volume
是一个具有静态存储持续时间的全局变量,radius
不是常量。因此错误。
答案 1 :(得分:3)
在C中,您只能使用常量表达式初始化函数外部的变量。 int radius
不是一个常数表达式。
答案 2 :(得分: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
中无效,其中所有初始化者必须是常量表达式。
答案 3 :(得分:1)
这方面的常量是没有内存地址的东西。 radius
有一个内存地址,因此不能用于初始化。
答案 4 :(得分: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;
}
现在,错误可能会消失。