初始化程序必须是常量

时间:2013-01-19 12:43:04

标签: c

我正在尝试学习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;
}

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

5 个答案:

答案 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;
}


现在,错误可能会消失。