2013-10-09 3 views
1

Я хотел бы определить размер многомерного массива как константу. Какой был бы лучший способ сделать это, пожалуйста? В приведенном ниже примере MY_CONSTANT будет равен 2. Может ли эта константа быть определена до времени выполнения?Определение размера массива в C++

#define MY_CONSTANT <what goes here?> 

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

'Const станд :: size_t ARRAY_SIZE = 2;'? BTW, предпочитает 'std :: array', когда у вас есть * constant * size array, иначе' std :: vector' (или 'std :: deque'). – 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' и урок истории :) –

Смежные вопросы