2012-01-28 86 views
2

以下代碼適用於GCC的C編譯器,但不適用於C++編譯器。是否有一個「捷徑」在C++中實現相同的結果?C++中單個元素的靜態數組初始化

int array[10] = { 
    [1] = 1, 
    [2] = 2, 
    [9] = 9 
}; 

編輯: 姆,我發現這個,澄清一切。 http://eli.thegreenplace.net/2011/02/15/array-initialization-with-enum-indices-in-c-but-not-c/

+0

'int數組[10] = {0,1,2,0,0,0,0,0,0,9} ;' – 2012-01-28 21:41:58

+3

這是一個C99功能。 – 2012-01-28 21:42:01

+0

@Mehrdad Afshari「指定初始值設定項」。 – cnicutar 2012-01-28 21:42:39

回答

5

這種初始化形式僅在C99標準中定義。它確實不是適用於C++。所以,就必須分配您的元件一個接一個:

int array[10] = { 0 }; 
array[1] = 1; 
array[2] = 2; 
array[9] = 9; 
+1

你需要'= {0}'。 – 2012-01-28 21:48:36

+0

正確。更新。 – 2012-01-28 21:49:13

+0

這不是*初始化*。 -1 – 2012-01-28 22:11:32

3

儘管gcc可能支持某種類型的C++擴展,但通常建議儘可能避免編譯器和平臺特定的擴展。

使用數組初始化的標準C++語法:

int array[10] = { 0, 1, 2, 0, 0, 0, 0, 0, 0, 9 }; 

或寫一個函數來做到的特定元素的初始化:

std::array<int, 10> create_initialized_array() 
{ 
    std::array<int, 10> values = { 0 }; 
    values[1] = 1; 
    values[2] = 2; 
    values[9] = 9; 
    return values; 
} 

std::array<int, 10> array = create_initialized_array(); 

或者使用lambda表達式:

std::array<int, 10> array = ([]() -> std::array<int, 10> 
{ 
    std::array<int, 10> values = { 0 }; 
    values[1] = 1; 
    values[2] = 2; 
    values[9] = 9; 
    return values; 
})(); 
+0

你可以看看我的提議非常類似的問題:http://stackoverflow.com/a/12839880/1463922。作爲std :: array的一部分做這樣的初始化會不會很有趣? – PiotrNycz 2012-10-11 12:50:39

+0

@PiotrNycz:這是一個有趣的想法。但是,不能將這樣的構造函數添加到'std :: array'。 'std :: array'被指定爲_aggregate_,這意味着它不能有任何用戶聲明的構造函數。其基本原理是允許集合初始化('T x [N] = {/ * initializers * /};'語法)。它可以移除聚合需求並添加對'initializer_list'的支持,但是這會破壞一些當前有效的C++ 11(和TR1)代碼(例如依賴大括號的代碼,我不相信這是有效的爲初始化列表)。 – 2012-10-11 16:27:15

+0

我不是故意添加「用戶聲明的構造函數」,無論它是什麼意思。我只是想添加構造函數,就像在C中一樣,只允許初始化所選元素,就是這樣。 C:'int [100] = {[55] = 7};',用我的數組:'CArray a {E [55] = 7};'。當然簡單的初始化仍然是有效的:'CArray a {0,0,...,7};' – PiotrNycz 2012-10-11 16:35:41