2016-01-22 139 views
0

在Gcc 4.8.2版本及之前版本中,以下代碼無法編譯,因爲數組大小不是編譯時間常量。在數組大小的情況下,gcc 4.8.2和gcc 4.9.0的行爲差異

#include<iostream> 
using namespace std; 

int f(){return 10;} 
int main() 
{ 
    int i=10; 
    int arr[f()]={}; //error 
} 

當我試圖在4.9和以後的版本上運行類似的代碼時,相同的代碼被成功編譯。

是編譯器允許這樣的代碼還是現在是標準的一部分?

注:以上代碼編譯失敗直到鐺3.7.1

+0

這是C還是C++?VLA只是其中之一的標準。無論如何GCC都支持它們。 – chris

+0

這是一個可變長度數組,vla,它的語言很重要,請選擇一個 –

+0

@chris:它是C++。 –

回答

5

可變長度數組是一個C99的功能,但允許作爲在GCC的擴展的C++。在C99中,它是非法的初始化可變長度數組:

6.7.8/3的類型的實體被初始化應未知大小或不是可變長度數組的對象類型的數組 類型。

無論是非法的初始化VLA在GCC沒有在manual指出,這樣你就可以假定它是未定義的行爲。但是,你也有另一個未定義行爲的來源:f()沒有return語句,因此你的程序中可能會發生任何事情(分段錯誤和異常是我在GCC 4.9.0中得到的兩個不同結果)

它編譯的原因在GCC 4.9.0中成功只是開發人員可以回答的問題。提交錯誤報告。

猜測:「運行時大小的數組」是proposed被添加到C++ 14,但沒有削減。 GCC在4.9中執行原始提案。我前面提到的例外是在該提案的特徵:

bad_array_length

namespace std { 
    class bad_array_length : public bad_alloc { 
    public: 
     bad_array_length() noexcept; 
    }; 
    } 

bad_array_length定義:

之前18.6.2.2 new.badlength新增加一節作爲 異常拋出的對象的類型通過實現報告嘗試分配 運行時綁定的數組,其大小小於或等於零o r 大於實現定義的限制(8.3.4 dcl.array)。

bad_array_length() noexcept; 

影響:構建bad_array_length類的對象。 備註:在新構建的對象上調用what()的結果是實現定義的。

該文檔指出,在GCC 5及更高版本中,現在支持just regular VLAs。如果是這樣的話,代碼應該被拒絕。

+0

我唯一擔心的是,這個代碼是如何在4.9版本上編譯的,所以f()的返回類型對我來說並不重要。反正我已經更新了它。 –

相關問題