Я не писал C ++ годами и сейчас пытаюсь вернуться к нему. Затем я наткнулся на это и подумал о том, чтобы сдаться:
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
Что это? Почему typedef
ключевое слово используется здесь? Почему имя TokenType
появляется дважды в этой декларации? Чем семантика отличается от этой:
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
Это наследие C, в C, если вы делаете:
Вы должны будете использовать это, делая что-то вроде:
Но если вы сделаете это:
Вы сможете объявить:
Но в C ++ вы можете использовать только первое определение и использовать его, как если бы оно было в определении типа C.
источник
Вам не нужно это делать. В C (не C ++) вы должны были использовать enum Enumname для ссылки на элемент данных перечислимого типа. Чтобы упростить его, вам было разрешено ввести его для одного типа данных.
разрешенные функции, принимающие параметр перечисления, должны быть определены как
вместо дольше
Обратите внимание, что имя typename не обязательно должно совпадать с именем enum. То же самое происходит со структурами.
В C ++, с другой стороны, это не требуется, так как перечисления, классы и структуры могут быть доступны напрямую как типы по их именам.
источник
В Си это хороший стиль, потому что вы можете изменить тип на что-то, кроме enum.
В C ++ вы можете определить enum, чтобы он компилировался как C ++ или C.
источник
In C++ you can *typedef* the enum so that it will compile as C++ or C.
? Вы сказали:In C++ you can define the enum so that it will compile as C++ or C.
Обратите внимание , как я изменил свойdefine
Totypedef
. Ну ... Я полагаю ,typedef
ING является определяющим.Удержание от C.
источник
Некоторые люди говорят, что у C нет пространств имен, но это технически неверно. У него есть три:
enum
,union
иstruct
)typedef enum { } XYZ;
объявляет анонимное перечисление и импортирует его в глобальное пространство имен с именемXYZ
.typedef enum ABC { } XYZ;
объявляет перечисление с именемABC
в пространстве имен тега, а затем импортирует его в глобальное пространство имен какXYZ
.Некоторые люди не хотят беспокоиться об отдельных пространствах имен, поэтому они вводят все. Другие никогда не вводят typedef, потому что им нужно пространство имен.
источник
Это довольно старо, но в любом случае, я надеюсь, вы оцените ссылку, которую я собираюсь напечатать, так как я оценил ее, когда натолкнулся на нее ранее в этом году.
Вот это . Я должен процитировать объяснение, которое всегда у меня в голове, когда я должен понять некоторые неприятные определения типа:
Как уже говорили многие люди, нет необходимости использовать typedefs для объявления перечислений в C ++ . Но это объяснение синтаксиса typedef! Я надеюсь, что это помогает (вероятно, не OP, так как это было почти 10 лет, но любой, кто изо всех сил пытается понять такие вещи).
источник
В некоторых руководствах по стилю кода C версия typedef считается предпочтительной для «ясности» и «простоты». Я не согласен, потому что typedef скрывает реальную природу объявленного объекта. На самом деле, я не использую typedefs, потому что при объявлении переменной C я хочу уяснить, что это за объект на самом деле. Этот выбор помогает мне быстрее вспомнить, что на самом деле делает старый фрагмент кода, и поможет другим при поддержке кода в будущем.
источник
Фактический ответ на вопрос «почему» (который неожиданно игнорируется существующими ответами поверх этого старого вопроса) заключается в том, что это
enum
объявление, вероятно, находится в заголовочном файле, который предназначен для перекрестной компиляции как кода на C, так и на C ++ (т.е. включены в оба варианта реализации C и C ++). Искусство написания таких заголовочных файлов опирается на способность автора выбирать языковые функции, которые имеют подходящее совместимое значение на обоих языках.источник