2012-12-09 48 views
6
#include <stdio.h> 

int i=10; 
int j=i; 
int main() 
{ 
    printf("%d",j); 
} 

我得到一個錯誤,指出初始化元素不是常量?這背後的原因是什麼?使用非常量初始化器定義全局變量

+0

'i'是一個變量,而不是一個常量。而C不允許用於全局或靜態變量的非常量初始值設定項。 C在這方面與C++不同。 –

+0

@ATaylor Nope。 const int不解決它。 –

+1

@ user963472:在C中(與C++不同)'const'聲明不會生成常量表達式。 –

回答

12

這是什麼原因?

C(與C++不同)不允許使用非常量值初始化全局值。

C99標準:節6.7.8:

所有在一個初始化表達式對於具有靜態存儲期限爲常量表達式或字符串文字的對象。

+0

我在互聯網上看到靜態存儲的變量是在加載時分配的。這是否與我的上述問題有關。 –

+0

@ user963472:我不明白你的問題。你能否詳細說明一下? –

2

你可以嘗試使用:

int i=10; 
int j=0; 

int main() 
{ 
    j=i;//This should be the first statement in the main() and you achieve the same functionality as ur code 
    return 0; 
} 

唯一真正的C方法是在運行時進行初始化。儘管在C++中,你的代碼可以正常工作,沒有任何編譯錯誤。

C標準明確禁止使用非常數值初始化全局對象。 C99標準的Section 6.7.8說:

所有在初始化表達式有靜態 存儲時間應是常量表達式或字符串文字的對象。

對象與static storage duration的定義是在節6.2.4:

其標識符被聲明與外部或內部 聯動,或與存儲類說明靜態對象具有靜態存儲 持續時間。它的生存期是程序的整個執行過程,其存儲值在程序啓動之前僅初始化一次。

1

這個要求背後的想法是讓所有的靜態存儲持續時間對象在編譯時初始化。編譯器以預初始化形式準備所有靜態數據,以便在運行時不需要額外的初始化代碼。即當編譯的程序被加載時,所有這些變量在已經初始化的狀態下開始其生命。

在C語言的第一個標準化版本(C89/90)中,這個要求也適用於聚合初始值設定項,即使它們與局部變量一起使用。

void foo(void) 
{ 
    int a = 5; 
    struct S { int x, y; } s = { a, a }; /* ERROR: initializer not constant */ 
} 

顯然該限制的原因是總初始化原本應建在提前預初始化的數據段,就像全局變量。

0

使用此: -

int i=10,j=1; 
int main() 
{ 
    printf("%d",j); 
} 

雖然這是一個很小的變化,但它的工作