2013-01-19 40 views
2

我想学习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; 
} 

为什么会发生这种情况,我能做些什么来使第一个版本工作?

+0

因为*初始化必须是常量* – ouah

回答

4

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

C99标准:第6.7.8:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

在你的榜样,volume是静态存储持续时间的全局变量,radius不是一个常数。因此错误。

+0

谢谢,我可以问为什么体积是全局变量蚂蚁半径不是? – intelis

+0

@intelis,你很混淆术语。 'radius' *是一个全局变量,但它不是一个常量表达式。 – StoryTeller

+0

@intelis:'volume'和'radius'都放在文件中的任何函数之外(* TU *),因此它们都是全局的,并且具有静态存储持续时间。两者都应该用常量表达式进行初始化。请注意,它们都不构成常量表达式。 –

3

在C语言中,只能使用常量表达式来初始化函数外的变量。 int radius不是一个常量表达式。

1

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

1

它只是C而不是C++,因此radius必须是常量,但是如果您希望它作为变量。
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; 
} 


现在,该错误可能消失定义volume

2

A 静态对象无法用非常量表达式进行初始化。在你的榜样,

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其中所有initalizers必须是常量表达式。

+0

谢谢。所以int是c中的非静态对象,而float是静态的吗?有什么不同? – intelis

+0

不,它不是''vs'浮动'的东西。全局变量有静态持续时间,而局部变量有自动持续时间在我的回答中,'volume'是一个局部变量,'radius'(静态对象)是一个全局变量。对象的*类型*无关紧要,而是在何处以及如何声明它们的区别。 –

相关问题