Как мы все знаем, длина массива в 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
И я думаю, что значение перечисления является постоянным, поэтому его следует использовать как длину массива. право?
Я в замешательстве, не могли бы вы мне помочь? Спасибо.
Как в 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, доступных для общественности, поэтому я могу подтвердить, что за этим.