Объявление в C ++ очень полезно, потому что значительно ускоряет время компиляции . Вы можете заранее объявить несколько вещей в C ++, включая: struct
, class
, function
и т. Д. *
Но можете ли вы объявить enum
в C ++?
Нет, ты не можешь.
Но почему бы не позволить это? Если бы это было разрешено, вы могли бы определить свой тип enum
в своем заголовочном файле и свои значения enum
в своем исходном файле. Похоже, это должно быть разрешено правильно?
Неправильно.
В C ++ нет типа по умолчанию для enum
, как в C # (int). В C ++ ваш тип enum
будет определяться компилятором как любой тип, который будет соответствовать диапазону значений, которые вы используете для вашего enum
.
Что это значит?
Это означает, что базовый тип вашего enum
не может быть полностью определен, пока у вас не будут определены все значения enum
. Кто из вас не может отделить декларацию и определение вашего enum
. И поэтому вы не можете переслать объявление enum
в C ++.
Стандарт ISO C ++ S7.2.5:
Базовый тип перечисления является целочисленным типом, который может представлять все значения перечислителя, определенные в перечислении. Это определяется реализацией, какой интегральный тип используется в качестве базового типа для перечисления, за исключением того, что базовый тип не должен быть больше int
, если только значение перечислителя не может поместиться в int
или unsigned int
. Если список перечислителя пуст, базовый тип выглядит так, как если бы перечисление имело один перечислитель со значением 0. Значение sizeof()
, примененное к типу перечисления, объекту типа перечисления или перечислителю, является значением sizeof()
применяется к базовому типу.
Вы можете определить размер перечисляемого типа в C ++ с помощью оператора sizeof
. Размер перечисляемого типа - это размер его базового типа. Таким образом, вы можете угадать, какой тип ваш компилятор использует для enum
.
Что, если вы укажете тип вашего enum
явно так:
enum Color : char { Red=0, Green=1, Blue=2};
assert(sizeof Color == 1);
Можете ли вы затем объявить свой enum
?
Нет. Но почему бы и нет?
Указание типа enum
на самом деле не является частью текущего стандарта C ++. Это расширение VC ++. Это будет часть C ++ 0x.
Источник