Согласно связанному вопросу, при обработке MAX_ARRAY_SIZE
компилятор не знает eTypes
. Тогда как TestArray
получает правильный размер. Я вижу TestArray из 8 байтов.
Гм, нет. Похоже, вы неправильно читаете это замечание из принятого ответа на этот вопрос :
Препроцессор запускается до того, как компилятор узнает что-нибудь о вашем enum
. Препроцессор знает только о макросах (#define
).
Препроцессор не распознает константы перечисления как отличающиеся от любого другого идентификатора, но, конечно, компилятор знает о них, пока объявление enum находится в области видимости. Не смущайтесь тем фактом, что на практике оба эти инструмента обычно находятся и работают в одной и той же программе.
Существует отдельный вопрос о том, считается ли выражение, включающее константы перечисления, константой времени компиляции,но стандарт отвечает, что ясно:
Выражение целочисленной константы должно иметь целочисленный тип и должно иметь только операнды, которые являются целочисленными константами, константами перечисления, символьными константами, выражениями sizeof, результаты которых являются целочисленными константами, выражениями _Alignofи плавающие константы, которые являются непосредственными операндами приведений. Операторы приведения в выражении с целочисленной константой должны преобразовывать только арифметические типы в целочисленные типы, кроме как как часть операнда, к оператору sizeof или _Alignof.
(C2011, 6.6 / 6)
«Целочисленное константное выражение» - это тип, необходимый для измерения обычного массива (в отличие от переменной с переменной длиной).