Определение макроса ARRAY_SIZE

Я обнаружил следующее определение макроса при чтении файла 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 (! (Sizeof (a)% sizeof (* (a))))) . На мой взгляд, следующее: поскольку последняя часть всегда будет иметь значение 1 , которое имеет тип size_t , все выражение будет преобразовано в size_t ].

Если это предположение верно, то возникает другой вопрос: поскольку тип возвращаемого значения оператора sizeof - size_t, зачем такое продвижение? В чем преимущество такого определения макроса?

13
задан Peter Mortensen 25 May 2018 в 22:08
поделиться