Вместо этого макроса, могу ли я предложить этот:
template<typename T, int N>
inline size_t array_size(T(&)[N])
{
return N;
}
#define ARRAY_SIZE(X) (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)
1) Мы хотим использовать макрос, чтобы сделать его постоянной времени компиляции; результат вызова функции не является константой времени компиляции.
2) Однако мы не хотим использовать макрос, потому что макрос мог случайно использоваться в указателе. Функция может использоваться только для массивов времени компиляции.
Итак, мы используем определенность функции, чтобы сделать макрос «безопасным»; если функция существует (то есть имеет ненулевой размер), то мы используем макрос, как указано выше. Если функция не существует, мы возвращаем неверное значение.