Я обнаружил следующее определение макроса при чтении файла globals.h в Google Проект V8 .
// The expression ARRAY_SIZE(a) is a compile-time constant of type
// size_t which represents the number of elements of the given
// array. You should only use ARRAY_SIZE on statically allocated
// arrays.
#define ARRAY_SIZE(a) \
((sizeof(a) / sizeof(*(a))) / \
static_cast(!(sizeof(a) % sizeof(*(a)))))
Мой вопрос касается последней части: static_cast
. На мой взгляд, следующее: поскольку последняя часть всегда будет иметь значение 1
, которое имеет тип size_t
, все выражение будет преобразовано в size_t
].
Если это предположение верно, то возникает другой вопрос: поскольку тип возвращаемого значения оператора sizeof
- size_t, зачем такое продвижение? В чем преимущество такого определения макроса?