2017-08-05 62 views
-1

在這裏,我試圖在本地變量X被分配給一個靜態變量並檢查是否其分配值與否一個程序。局部變量;編譯錯誤在「C」,但成功的在C++

我做了程序'C':很顯然它會給編譯時間錯誤一個(初始化元素不是常量)。

然後我在C++實施同一程序:這一次我沒有得到編譯時錯誤,但輸出爲「平等」(是不是應該給一個編譯時錯誤如前)。

請解釋一下。

int main() //C code 
{ 
    int x=10; 
    static int i=x; 
    if(i==x) 
     printf("Equal"); 
    return 1; 
} 


int main() //C++ code 
{ 
    int x=10; 
    static int i=x; 
    if(i==x) 
     cout<<"equal"; 
    return 0; 
} 
+5

因爲C和C++是不同的語言。 –

回答

7

與C++不同,C要求靜態初始值設定爲常量。這不是在C編譯,但會用C++編譯:

int makeInitialValue() { 
    return 42; 
} 
static int val = makeInitialValue(); 

這是因爲進入mainstatic的功能之外的變量之前執行C++插入特殊的初始化代碼到你的程序,或輸入功能之前,當地靜力學。 C沒有這樣做,而是需要所有的static初始值爲編譯時常量。

參考文獻:

C99標準,6.7.8

  • 所有在一個初始化的表達對於具有靜態存儲持續時間應是恆定的一個目的表達式或字符串文字。
  • C++ 11標準,3.6.2

    一起,零初始化和恆定初始化被稱爲靜態初始化;其他初始化爲動態初始化。它是執行定義的,是否在main的第一條語句之前動態初始化具有靜態存儲器持續時間的非本地變量。

    +0

    我認爲相關部分是當函數在C++中第一次被調用時,函數中的'static'變量被初始化。 C在程序啓動之前初始化它們。 – melpomene

    +0

    是的。一個狡猾的計劃混淆C++開發人員 - 一個靜態c'tor中的錯誤可能意味着第一行主要沒有達到:) –

    +0

    好吧,謝謝你們 –