2013-01-19 66 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'(靜態對象)是一個全局變量。對象的*類型*無關緊要,而是在何處以及如何聲明它們的區別。 –

相關問題