2015-11-06 122 views
-1

我有一些代碼,初始化數組,具體地C-字符串,使用變量。例如...可變大小數組工作可變地(計算機之間)

int len = getLength(); 
char cstr[len+1] = {'\0'}; 

這編譯和運行在我的代碼完美無瑕。然而,當我的同事的一個運行相同的代碼,他得到編譯器錯誤...

可變大小的物體可能不被初始化

我們使用Ubuntu和GCC都

/G ++。我們比較了編譯器標誌,我們都使用--std=c++11。所有其他的標誌也是相同的(-Wall,-Wextra-g)。

爲什麼僅工作在我的電腦上運行此代碼,而不是他的?我怎樣才能使它工作?

回答

-2

這是不同的編譯器版本的情況下。當我們在我們的終端上運行g++ --version時,我們發現他運行的是4.8,而我運行的是4.9

GCC長期支持C99可變長度的數組(VLA),其中一個變量聲明,但沒有任何初始化列表。因此,我的同事可以通過從每個初始化移除{'\0');解決錯誤(這也打破了在這種情況下的代碼。)

然而,在過去的日子裏,GCC有支持C++1y沃拉斯,這是我在這個問題的例子中。他們只是增加了對GCC 4.9中的支持(請參閱Changelog)。

的Ubuntu 14.04(什麼我的同事有)附帶GCC 4.8,而Ubuntu的15.04(我有)附帶GCC 4.9。因此,我們必須使用相同的編譯器版本,即GCC 4.9。 (說明這樣做,是對this question。)

如果你正在運行到Windows上這個問題上,有選擇有作爲。截止撰寫時,MSYS2默認提供GCC 5.2,TDM-GCC提供GCC 5.1。

+1

@SergeyA:構建知識庫是Stackoverflow的一個聲明目標。整個評分系統只是一個副作用。 –

+0

@SergeyA:你是什麼意思*如果*這是促進?它正在被提升,這不是什麼新鮮事。 Stackoverflow還沒有變成Facebook,這裏有一些很好的答案是自我回答。所以有什麼問題? –

+1

我會在這裏補充一點,我只是共享信息,因爲這沒有很好的文檔記錄(因爲它對於更有經驗的程序員來說是如此明顯),所以直到了解了具有這種效果的編譯器版本之前,這對他們來說是完全神祕的。現在Google會很快得出答案。 StackOverfow的排名高於搜索結果中的博客,所以每個人都可以在這裏發佈。 – CodeMouse92