При чтении 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<size_t>(!(sizeof(a) % sizeof(*(a)))))
Мой вопрос - последняя часть: static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
. Одна вещь в моем сознании заключается в следующем: поскольку последняя часть всегда будет оцениваться до 1
, которая имеет тип size_t
, поэтому всему выражению будет способствовать size_t
. Если это предположение верно, возникает другой вопрос: поскольку тип возврата оператора sizeof
равен size_t, почему такое продвижение необходимо? Какая польза от определения макроса таким образом?
Большое спасибо за чтение.