Определение количества элементов в массиве

Рейтинг: 4Ответов: 3Опубликовано: 26.01.2011

Сейчас я определяю количество элементов в статическом массиве с помощью следующего выражения:

sizeof(Array)/sizeof(Array[0])

Я слышал, что существует стандартный макрос для этого действия, скажите как он называется или, может быть, существует более простой способ?

Ответы

▲ 13
template<typename T, size_t n>
inline size_t arraySize(const T (&arr)[n])
{
    return n;
}

По сравнению с упомянутым макросом минусов, я лично, не вижу. Любой компилятор подобный вызов заоптимизирует просто в константу.

Есть ли какие-то плюсы? Думаю, да. Макросы — это штука такая довольно мутная. С ними очень легко ошибиться (см. комментарии к предыдущему ответу). Один раз определённый макрос будет потом болтаться и там, где его можно не ожидать. Эта же штука ведёт себя как любая другая функция. Её даже IntelliSense видит и автодополняет! :).

▲ 4

В MSVC есть отличный макрос: _countof(). Он как раз и разворачивается в конструкции вида sizeof(Array)/sizeof(Array[0])

▲ 2

Возможно что и существует подобный макрос в какой нибудь библиотеке, но в Стандарте разумеется такого нет. Да и что мешает написать самому макрос раз так нужен!?

PS: для сишных массивов с постоянной длиной более правильного способа не существует.