23:59
Подстава enum
Я привык к старым дефайн-константам. Они простые как валенок и привычные. Но есть более прогрессивный тип -- enum. Вы как бы об'являете сразу кучу констант и тип, которому можно присваивать только одну из них. Численные значения присваиваются автоматически, хотя можно задать вручную. Я не буду расписывать подробно синтаксис.
Подстава в том, что идентификаторы енума имеют глобальную область видимости, поэтому они не могут повторяться. Сделав парочку похожих енумов с совпадающими названиями я обнаружил, что это не компилируется. Поэтому я воспользовался дедовским способом, ввёл префиксы в названиях констант енума.
Итак, у меня был енум-тип, имеющий типичное назначение -- обозначать один тип данных из нескольких.
Как видно, префиксы я ввёл. Но это меня не спасло. Код не компилировался. Мне компилятор сообщал, что VT_INT уже об'явлён, причём предыдущее об'явление -- тоже енум! Но я такого нигде не писал. Тогда я... загуглил. И нашёл вот это:
docs.microsoft.com/en-us/windows/win32/api/wtyp...
То есть, у винды уже оказался тип с похожим назначением. И у него оказалась константа с точно таким же именем, несмотря на то, что я ввёл префикс. Повезло!
Пришлось мне мою константу переименовать в VT_INTEGER.
А ещё! В Си++11, оказывается, есть енумы с ограниченной областью видимости. Чтобы константы не конфликтовали, следует написать enum class вместо enum. Тогда доступ к константам будет только через ValType::VT_BYTE и подобное.
Подстава в том, что идентификаторы енума имеют глобальную область видимости, поэтому они не могут повторяться. Сделав парочку похожих енумов с совпадающими названиями я обнаружил, что это не компилируется. Поэтому я воспользовался дедовским способом, ввёл префиксы в названиях констант енума.
Итак, у меня был енум-тип, имеющий типичное назначение -- обозначать один тип данных из нескольких.
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 и подобное.
Пожалуйста, ознакомьтесь с комментариями!
06.11.2020 в 15:33
Не глобальную, а внешнюю!
И даже:
Последнее обычно самое идеологически точное. Например, если у тебя MyVariant, то MyVariant::VT_INT.
06.11.2020 в 18:32