2012-04-08 267 views
19

最近,我嘗試使用C++ 11支持的新功能,但是我編寫了這樣的語句,但編譯器運行失敗。爲什麼我不能在最新版本的gcc中使用auto關鍵字

auto x = 1; 

下列報錯:

D:\DEV\CBCppTest\main.cpp||In function 'int main()':| 
D:\DEV\CBCppTest\main.cpp|22|warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]| 
D:\DEV\CBCppTest\main.cpp|22|error: 'x' does not name a type| 
||=== Build finished: 1 errors, 1 warnings ===| 

爲什麼MinGW的最後一個版本的GCC 4.7.0不能支持這種說法。但是vs10的編譯器通過了。任何人都可以知道這個問題的原因嗎?

回答

29

「GCC爲2011 ISO C++標準提供了實驗支持,可以使用-std = C++ 11或-std = gnu ++ 11編譯器選項啓用此支持;前者禁用GNU擴展。

它來自這裏:c+11 support

+0

謝謝,很困惑我很久。 – 2012-04-08 15:20:25

5

編譯時,你需要添加-std=c++11到g ++命令行。

2

這是由於GCC編譯器默認不啓用該功能。如果你在Codeblocks上,去設置 - >編譯器,並啓用功能,如圖所示 - http://imgur.com/KrHx8nh

7

解釋什麼是編譯器實際上抱怨:auto曾經是一箇舊的C關鍵字,聲明這個變量有自動倉儲。這些關鍵字與類型系統無關,它們指定變量在內存中的表示方式:它們存儲在何處(處理器寄存器與主內存/堆棧)以及內存如何回收。 auto表示變量存儲在堆棧中(儘管處理器可能將其優化爲處理器寄存器),並且當變量超出範圍時,內存爲 - 這是幾乎任何情況下的正確選擇和因此是默認的,所以幾乎沒有人使用這個舊的auto關鍵字。然而,C++03仍然爲代碼提供了向後兼容性;今天的編譯器仍然想要支持遺留代碼。


雖然經常想要對象駐留在堆上,你仍然可以訪問那些通過堆棧變量; C++有自己的方法使用堆分配內存(new,std::vector等),你不需要不安全的C型malloc的東西。

1

對於我添加「-std = C++ 0x」「到g ++命令行修復了這個問題

相關問題