2014-09-19 66 views
7

我只是跳進C++,選自CC++陣列大小的聲明和const

在C(九十〇分之八十九)到來,一個const實際上不是一個常數(而不是一個#define倒是,enum,或文字),而是隻讀一次設置。即,我可以:

const int x = rand(); 

這很好 - 點是x不知道,直到運行時。因此,我不能

int arr[x]; // error - x is not a compile-time constant 

然後,其中一個C標準(99?)繼續前進,並允許可變長度數組。儘管我通常使用C語言來編寫ANSI標準,但實際上我正在嘗試拾取C++ 11,這實際上已經產生了影響。我知道,C++不允許變長數組。但是,許多編譯器允許它作爲擴展(GCC?)。問題是,現在我正在學習C++ 11,我不知道我編碼是有效的C++,還是C++擴展了C99兼容性。例如:

std::default_random_engine e{}; 
std::uniform_int_distribution<int> d{}; 
const int x{d(e)}; 
int arr[x]; // compiles 

我不知道這是否是有效的C++或不。很顯然,x的值只有在運行時纔會知道。我想我可能不明白C和C++ const之間的區別?

+0

無效。使用標誌'-std = ...',其中'...'是標準的,例如'C++ 11'或'C++ 98'。 – juanchopanza 2014-09-19 17:24:41

+2

您也可以使用'-pedantic' – Jarod42 2014-09-19 17:27:20

+0

@juanchopanza我實際上使用'-std = C++ 11'進行編譯,並且clang沒有產生任何警告。建議Shafik使用「pedantic」標誌使警告彈出! – zac 2014-09-19 17:28:11

回答

9

你是正確的VLAs are a C99 feature在C11可選)和C++標準不包含這個功能雖然兩者gccclang讓他們在C++作爲擴展。使用-pedantic標誌,當您使用延長會警告

D1 [ constant-expressionopt] attribute-specifier-seqopt 
    ^^^^^^^^^^^^^^^^^^^^^^ 

對於這兩種gccclang:我們可以看到他們不受要去draft C++11 standard部分8.3.4陣列它說允許的。如果你的目標是C++ 11,那麼你也應該指定使用-std=c++11。您可以使用-pedantic-errors將警告轉化爲錯誤。如果您在使用-pedantic編譯代碼,你應該會看到以下警告:

warning: ISO C++ forbids variable length array 'arr' [-Wvla] 
int arr[x]; // compiles 
     ^

gcc記錄了他們的各種標準,違約和標誌強制執行標準的Language Standards Supported by GCC頁面上的支持,並說:

要獲得標準所需的所有診斷,您應該在 中指定-pedantic(或-pedantic-errors,如果您希望它們是 錯誤而不是警告)。

一般clang支持什麼gcc做,但你可以找到他們的Language Compatibility網頁上的更多細節。

GingerPlusPlus std:vector提到的注意事項被認爲是C++中VLA的替代方案。

+0

奇妙!所以這似乎*是*使用C99擴展 – zac 2014-09-19 17:25:26

+0

感謝(非常快)的響應! – zac 2014-09-19 17:26:25

+0

感謝編輯以及..這使得它現在非常清楚 – zac 2014-09-19 17:31:47