2013-10-09 103 views
1

我想將多維數組的大小定義爲常量。請問最好的方法是什麼?在下面的例子中,MY_CONSTANT等於2.這個常量可以在運行時間之前確定嗎?在C++中定義數組大小

#define MY_CONSTANT <what goes here?> 

std::string myArray[][3] = { 
{"test", "test", "test"}, 
{"test", "test", "test"} 
}; 
+3

'常量的std ::爲size_t ARRAY_SIZE = 2初始化它;'?順便說一句,當你有*常量*大小的數組,或者'std :: vector'(或者'std :: deque')時,更喜歡'std :: array'。 – Nawaz

+1

在C++中,您應該將'const'變量設置爲'#define'。它們可以用作編譯時常量,也可以用作範圍。 –

回答

10

您可以使用std::extent獲得在編譯時數組的大小:

std::string myArray[][3] = { 
    {"test", "test", "test"}, 
    {"test", "test", "test"} 
}; 

const std::size_t myArraySize = std::extent<decltype(myArray)>::value; 

預處理程序無法直接定義值。當然,你可以使用

#define MY_CONSTANT std::extent<decltype(myArray)>::value 

,但我想這不是真的想做的事。

+0

+1我不知道['extent'](http://en.cppreference.com/w/cpp/types/extent)。 – deepmax

+0

謝謝。我會試一試。 – Jim

+0

const std :: size_t MY_CONSTANT = std :: extent (); – QuentinUK

1
您使用C++

,更好地利用const代替#define

#define是一個預處理器指令,它將在編譯之前執行文本替換。

const int創建一個只讀變量。 所以最好用類似的東西:const size_t arraySize = 2;

「這個常數是否可以在運行時間之前確定?」

,你將不得不使用使用new 或更好地利用vector動態分配數組從STL

3

在C++ 11,你可以用一個constexpr函數初始化一個編譯時間常數:

template <typename T, size_t N> 
constexpr size_t array_size(T(&)[N]) {return N;} 

constexpr size_t MY_CONSTANT = array_size(myArray); 

(或使用std::extent作爲另一個答案建議;我不知道的事情)。

歷史,你會需要一個常量表達式像

const size_t MY_CONSTANT = sizeof(myArray)/sizeof(myArray[0]); 
+0

+1對'constexpr'和歷史課:) –