Хорошо, я не совсем новичок, но я не могу сказать, что понимаю следующий макрос. Самая запутанная часть - это разделение со значением, отличным от size_t: что же это делает? Тем более, что я вижу оператор отрицания, который, насколько я знаю, может привести к нулевому значению. Разве это не означает, что это может привести к ошибке деления на нуль? (Кстати, макрос правилен и прекрасно работает.)
#define ARRAYSIZE(a) \
((sizeof(a) / sizeof(*(a))) / \
static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))