значение типа enum как длина массива в переполнении стека

Как мы все знаем, длина массива в C ++ должна быть определена. Тогда мы можем использовать:

const int MAX_Length=100;

или же:

#define MAX_LENGTH 100

определить длину массива перед компиляцией. Но когда я читаю книгу c ++ primer от lippman, в главе 3.5.1 в 5-м издании, она говорит: длина массива должна быть константным выражением. Тогда возникает проблема:

typedef enum Length{LEN1=100, LEN2, LEN3, LEN4}LEN;
LEN MAX_Length=LEN2;  //101
int iArray[LEN2];     //attention

код успешно скомпилирован в mingw32-g ++. Но не удалось в VS2008, и ошибки:

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'iArray' : unknown size

И я думаю, что значение перечисления является постоянным, поэтому его следует использовать как длину массива. право?

Я в замешательстве, не могли бы вы мне помочь? Спасибо.

6

Решение

Как в C ++ 11, так и в C ++ 03 перечислителях (перечисления с незаданной областью в C ++ 11) являются целочисленными константными выражениями и поэтому могут использовать границы массива. Мы можем увидеть это для C ++ 11, перейдя к проект стандарта C ++ 11 раздел 5.19 [Expr.const] который говорит:

Целочисленное константное выражение — это выражение интегрального или
тип перечисления с незаданной областью, неявно преобразуемый в значение типа prvalue, где
преобразованное выражение является основным выражением константы. [Примечание: такие
выражения могут использоваться как границы массивов (8.3.4, 5.3.4), как битовые поля
lengths (9.6), как инициализаторы перечислителя, если базовый тип
не исправлено (7.2), как константы нулевого указателя (4.10) и как выравнивания
(7.6.2). —Конечная записка]

и или C ++ 03 мы можем видеть это из проекта стандарта C ++ 03 или ближе всего мы можем получить тот же параграф 1 который говорит:

[…] Интегральная константа-выражение может включать только литералы
арифметические типы (2.13, 3.9.1), перечислители, энергонезависимые константы
переменные или статические члены данных целочисленных или перечислимых типов
инициализируется с помощью константных выражений (8.5), не тип шаблона
параметры целочисленных или перечислимых типов и sizeof
выражения […]

На ректестере этот код компилирует нормально для VC ++, так что это больше не проблема в текущих версиях, это, должно быть, ошибка в 2008 году, которая в конечном итоге была исправлена. Также проверено на WebCompiler последний раз обновлялся 3 декабря 2015 года, так что это работает и на одном из последних релизов.

Одной из альтернатив может быть использование const int например:

const int len = LEN2 ;

это будет зависеть от того, считает ли Visual Studio 2008 перечислители не целочисленными константными выражениями или это просто в контексте границ массива, возможно, это будет позже.

С ++ 98

Насколько я могу судить, это относится и к C ++ 98, и к gcc а также clang разрешить это при использовании -std=c++98Есть не проекты стандартов C ++ 98, доступных для общественности, поэтому я могу подтвердить, что за этим.

6

Другие решения


По вопросам рекламы [email protected]