C
Это невозможно в C, потому что все константы перечисления из различных перечислений, которые находятся в области видимости, являются частью того же пространства имен, называемого пространством имен обычных идентификаторов.Поэтому использование одного и того же имени для констант приведет к ошибке повторного объявления.
Согласно стандарту C11:
6.2.3 Пространства имен идентификаторов
- Таким образом, существуют разные пространства имен для различных категорий идентификаторов, а именно:
...
- все остальные идентификаторы, вызываемые обычные идентификаторы (объявленные в обычных деклараторах или константы перечисления ).
C ++
Это возможно в C ++, если вы используете перечисления в области .
enum class all_personnel {
// male
TONY,
MIKE,
JIM,
// female
JESSICA,
MARY,
} ;
enum class male_personnel {
TONY,
MIKE,
JIM,
} ;
Однако обратите внимание, что не существует неявных преобразований значений перечислителя с областью действия в целочисленные типы или из одного перечислителя с областью действия в другой перечислитель области.Это потому, что каждый перечислитель становится именованной константой типа перечисления.
Таким образом, нижеследующее невозможно:
male_personnel mp2 = all_personnel::TONY; //will not work
all_personnel ap2 = male_personnel::MIKE; //will not work
, и тоже:
male_personnel mp1 = male_personnel::MIKE;
all_personnel ap1 = all_personnel::TONY;
mp1 = ap1; //will not work
См. Демонстрация