我多年没有写过任何C++,现在我想回到它.然后我跑过去想着放弃:
typedef enum TokenType { blah1 = 0x00000000, blah2 = 0X01000000, blah3 = 0X02000000 } TokenType;
这是什么?为什么typedef
这里使用关键字?为什么名称TokenType
在此声明中出现两次?语义与此有何不同:
enum TokenType { blah1 = 0x00000000, blah2=0x01000000, blah3=0x02000000 };
Ryan Fox.. 150
在C中,以第一种方式声明你的枚举允许你像这样使用它:
TokenType my_type;
如果你使用第二种风格,你将被迫声明你的变量:
enum TokenType my_type;
正如其他人所说,这对C++没有任何影响.我的猜测是,写这篇文章的人要么是C程序员,要么是将C代码编译为C++.无论哪种方式,它都不会影响代码的行为.
在C中,以第一种方式声明你的枚举允许你像这样使用它:
TokenType my_type;
如果你使用第二种风格,你将被迫声明你的变量:
enum TokenType my_type;
正如其他人所说,这对C++没有任何影响.我的猜测是,写这篇文章的人要么是C程序员,要么是将C代码编译为C++.无论哪种方式,它都不会影响代码的行为.
如果您这样做,它是C语言中的C遗产:
enum TokenType { blah1 = 0x00000000, blah2 = 0X01000000, blah3 = 0X02000000 };
你必须使用它做类似的事情:
enum TokenType foo;
但是如果你这样做:
typedef enum e_TokenType { blah1 = 0x00000000, blah2 = 0X01000000, blah3 = 0X02000000 } TokenType;
你将能够声明:
TokenType foo;
但是在C++中,您只能使用前一个定义并将其用作C typedef.
你不需要这样做.在C(不是C++)中,您需要使用枚举Enumname来引用枚举类型的数据元素.为了简化它,你被允许的typedef它一个名称的数据类型.
typedef enum MyEnum { //... } MyEnum;
允许函数将枚举的参数定义为
void f( MyEnum x )
而不是更长的
void f( enum MyEnum x )
请注意,typename的名称不必等于枚举的名称.结构也是如此.
另一方面,在C++中,它不是必需的,因为枚举,类和结构可以通过其名称直接作为类型访问.
// C++ enum MyEnum { // ... }; void f( MyEnum x ); // Correct C++, Error in C
在C中,它是一种很好的风格,因为你可以将类型改为枚举之外的东西.
typedef enum e_TokenType { blah1 = 0x00000000, blah2 = 0X01000000, blah3 = 0X02000000 } TokenType; foo(enum e_TokenType token); /* this can only be passed as an enum */ foo(TokenType token); /* TokenType can be defined to something else later without changing this declaration */
在C++中,您可以定义枚举,以便它将编译为C++或C.
来自C的保留
有人说C没有命名空间,但技术上并不正确.它有三个:
标签(enum
,union
,和struct
)
标签
(其他一切)
typedef enum { } XYZ;
声明一个匿名枚举,并使用名称将其导入全局命名空间XYZ
.
typedef enum ABC { } XYZ;
声明ABC
在标记命名空间中命名的枚举,然后将其作为全局命名空间导入XYZ
.
有些人不想打扰单独的命名空间,因此他们输入了所有内容.其他人从不打字,因为他们想要命名空间.