6.12.8 Расширения объявлений типов enum
В стандартах C23 и C++11 был добавлен новый синтаксис для указания базового типа типа enum. Например,
enum pet : unsigned char { CAT, DOG, ROCK };
В GCC эта возможность также поддерживается в качестве расширения во всех более ранних диалектах C и C++. Для диалектов C++ до C++11 используйте -Wno-c++11-extensions, чтобы отключить соответствующие предупреждения.
Вы также можете предварительно объявить тип enum, не указывая его возможные значения. Перечислители задаются в последующем повторном объявлении типа, которое должно соответствовать базовому типу из первого объявления.
enum pet : unsigned char;
static enum pet my_pet;
...
enum pet : unsigned char { CAT, DOG, ROCK };
Предварительное объявление типов enum с явным указанием базового типа — это также возможность C++11, поддерживаемая GCC в качестве расширения для всех диалектов C. Однако она недоступна в диалектах C++ до C++11.
Стандарт C++ называет предварительное объявление типа enum с явным указанием базового типа непрозрачным типом. Он не считается неполным типом, поскольку его размер известен. Это означает, что до повторного объявления можно объявлять переменные или выделять память, используя этот тип, а не только использовать указатели на него.
Кроме того, GCC традиционно поддерживает предварительные объявления типов enum без явного указания базового типа. В результате получается неполный тип, примерно такой же, как если написать struct foo, не описывая элементы. Пока тип является неполным, нельзя объявлять переменные или выделять память, используя его. Однако можно работать с указателями на этот тип.
Предварительное объявление неполного типа enum без явного указания базового типа поддерживается в качестве расширения во всех диалектах GNU C, но совсем не поддерживается в GNU C++.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Enum-Extensions.html