zHz00 Untitled

четверг, 05 ноября 2020
23:59 Подстава enum
Я привык к старым дефайн-константам. Они простые как валенок и привычные. Но есть более прогрессивный тип -- enum. Вы как бы об'являете сразу кучу констант и тип, которому можно присваивать только одну из них. Численные значения присваиваются автоматически, хотя можно задать вручную. Я не буду расписывать подробно синтаксис.

Подстава в том, что идентификаторы енума имеют глобальную область видимости, поэтому они не могут повторяться. Сделав парочку похожих енумов с совпадающими названиями я обнаружил, что это не компилируется. Поэтому я воспользовался дедовским способом, ввёл префиксы в названиях констант енума.

Итак, у меня был енум-тип, имеющий типичное назначение -- обозначать один тип данных из нескольких.

enum ValType
{
VT_BYTE,
VT_INT,
VT_FLOAT,
VT_STRING
};


Как видно, префиксы я ввёл. Но это меня не спасло. Код не компилировался. Мне компилятор сообщал, что VT_INT уже об'явлён, причём предыдущее об'явление -- тоже енум! Но я такого нигде не писал. Тогда я... загуглил. И нашёл вот это:

docs.microsoft.com/en-us/windows/win32/api/wtyp...

То есть, у винды уже оказался тип с похожим назначением. И у него оказалась константа с точно таким же именем, несмотря на то, что я ввёл префикс. Повезло!

Пришлось мне мою константу переименовать в VT_INTEGER.

А ещё! В Си++11, оказывается, есть енумы с ограниченной областью видимости. Чтобы константы не конфликтовали, следует написать enum class вместо enum. Тогда доступ к константам будет только через ValType::VT_BYTE и подобное.

Пожалуйста, ознакомьтесь с комментариями!

@темы: Программирование

URL
Запарили на работе со своей музыкой...у меня о ней только...
:tongue: Прикольный баннер... :D
Жили были безграничные люди,снег падал им на голову,и с н...
а я все чаще замечаю, что иногда непроизвольно смотрю на ...
Посмотрел кусочек новой передачи Нагиева, это пи...ц, это...
Кто-то подсовывает их мне в диком количестве, если плохо ...

06.11.2020 в 15:33

06.11.2020 в 15:33
> Подстава в том, что идентификаторы енума имеют глобальную область видимости

Не глобальную, а внешнюю!
namespace MyProject {
enum Sd {Asd, Bsd, Csd}
}

MyProject::Asd


И даже:
class MyClass {
public:
enum Sd {...}
}


Последнее обычно самое идеологически точное. Например, если у тебя MyVariant, то MyVariant::VT_INT.
URL

06.11.2020 в 18:32

06.11.2020 в 18:32
himself, йошкин кот, ты прав! Пожалуй, так и сделаю!
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии