我最近在为我发布的答案中看到了这一点:
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
int main()
{
operator_t operator = NO_OP;
}
什么是typedef枚举?我们为什么要使用它?我用Google搜索并发现以下内容: http://www.programiz.com/c-programming/c-enumeration
现在它对我来说听起来有点太技术性,所以我不认为我理解发生了什么或为什么会使用它。
Bonus(可选):operator_t是什么类型的变量?
答案 0 :(得分:13)
绝对不是“太技术化”。
拥有“枚举”的基本原因是避免“魔术数字”:
假设你有三个“状态”:STOP,CAUTION和GO。你如何在你的计划中代表他们?
一种方法是使用字符串文字“STOP”,“CAUTION”和“GO”。但这有很多问题 - 包括你不能在C“开关/案例”块中使用它们。
另一种方法是将它们映射到整数值“0”,“1”和“2”。这有很多好处。但在代码中看到“停止”比看到“更有意义” 0“。在你的代码中使用”0“是一个”magic number“的例子。幻数是坏的:你想要使用”有意义的名字“。
在使用该语言介绍枚举之前,C程序员使用了宏:
#define STOP 0
#define CAUTION 1
#define GO 2
现代C / C ++中更好,更清晰的方法是使用枚举:
enum traffic_light_states {
STOP,
CAUTION,
GO
};
使用“typedef”只是简化了这种类型的变量的声明:
typedef enum {
STOP,
CAUTION,
GO
} traffic_light_states_t ;
答案 1 :(得分:5)
typedef
用于定义现有类型的备用名称。 enum
可以像这样声明:
enum operator_t
{
NO_OP,
ADDITION,
};
然后你可以像这样声明一个这种类型的变量:
enum operator_t x = NO_OP;
这有点冗长,因此您可以使用typedef
为此类型定义较短的别名:
typedef enum operator_t operator_t;
这将operator_t
定义为enum operator_t
类型,允许您初始化变量,如下所示:
operator_t x = NO_OP;
此语法:
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
一步完成整个过程,因此它定义了一个(无标记的或无标记的)enum
类型,并为其提供了别名operator_t
。
奖励:operator_t
是enum
数据类型;在此处详细了解:https://en.wikipedia.org/wiki/Enumerated_type
答案 2 :(得分:2)
什么是typedef枚举?我们为什么要使用它?
有两种不同的东西:typedef和枚举类型(“enum”)。 typedef是一种为类型声明替代名称的机制。枚举类型是一个整数类型,带有一组关联的符号常量,表示该类型的有效值。
首先使用枚举,枚举声明的完整形式由enum
关键字组成,后跟一个标记,通过该标记识别特定的枚举,然后是大括号中的符号枚举常量。默认情况下,枚举常量对应于从零开始的连续整数值。例如:
enum operator {
NO_OP,
ADDITION
};
如您所见,它与struct
声明有一些相似之处,就像struct
声明一样,枚举类型的变量可以在同一语句中声明:
enum operator {
NO_OP,
ADDITION
} op1, op2, op3;
或者可以通过引用枚举标记来声明它们:
enum operator op4, op5;
也像struct
声明一样,标签可以省略,在这种情况下,枚举类型不能在源代码的其他地方引用(但该类型的任何声明变量仍然可以):
enum {
NO_OP,
ADDITION
} op1, op2, op3;
现在我们来到typedef。正如我已经写过的,typedef是一种为类型声明替代名称的方法。它的工作原理是将typedef
关键字放在一些本来可以作为变量声明的东西之前;那个本来就是变量名的符号就是该类型的替代名称。例如......
typedef unsigned long long int ull_t;
声明ull_t
是类型unsigned long long int
的替代名称。此后,这两个类型名称可以互换使用(在typedef声明的范围内)。
在你的情况下,你有
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
将operator_t
声明为给定的无标记枚举类型的别名。以这种方式声明typedef使得enum可以通过typedef名称在别处使用,即使枚举是无标记的。这是一种相当常用的机制,用于声明枚举类型的简写名称,类似技术也适用于结构。
Bonus(可选):operator_t是什么类型的变量?
正如我所解释的,operator_t
不是变量,而是一种类型。特别是,它是枚举类型,符号NO_OP
和ADDITION
代表该类型的值。
答案 3 :(得分:1)
Wikipedia对typedef的内容进行了很好的讨论
typedef是C和C ++编程语言中的关键字。 typedef的目的是从更基本的机器类型1形成复杂类型,并为这种组合分配更简单的名称。当标准定义或声明繁琐,可能令人困惑或可能因实现而异时,最常使用它们。 See this page for a detailed discussion of Typedef in Wikipedia
枚举类型允许我们为相关想法列表创建自己的符号名称。
鉴于您给出的示例,我猜测您可以使用枚举来选择要用于特定变量集的算术运算。
以下示例代码应该让您对枚举有用的内容有所了解。
enum ARITHMETIC_OPERATION {ADD, SUBTRACT, MULTIPLY};
int do_arithmetic_operation(int a, int b, enum ARITHMETIC_OPERATION operation){
if(operation == ADD)
return a+b;
if(operation == SUBTRACT)
return a-b;
if(operation == MULTIPLY)
return a*b;
}
如果你没有枚举,你会做这样的事情:
#DEFINE ADD 0
#DEFINE SUBTRACT 1
#DEFINE MULTIPLY 2
int do_artithmetic_operation(int a, int b, int operation);
此替代方案可读性较差,因为操作实际上不是整数,而是表示ADD,MULTIPLY或SUBTRACT算术运算的符号类型。
以下链接提供了使用Enum的良好讨论和示例代码。
http://www.cs.utah.edu/~germain/PPS/Topics/C_Language/enumerated_types.html
http://www.cprogramming.com/tutorial/enum.html
http://cplus.about.com/od/introductiontoprogramming/p/enumeration.htm
答案 4 :(得分:0)
typedef和enum是两个不同的概念。您可以像这样重写代码:
enum operator
{
NO_OP,
ADDITION
};
typedef enum operator operator_t;
第一个语句声明了一个名为operator
的枚举,其中包含两个值。第二个语句声明枚举operator
现在也被称为类型operator_t
。
语法允许将这两个语句组合成一个语句:
typedef enum operator
{
NO_OP,
ADDITION,
} operator_t;
最后省略枚举的名称,因为无论如何都有一个数据类型:
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
答案 5 :(得分:0)
枚举,结构和联合的Typedef完全是浪费。它们隐藏了重要信息,以保存一些字符可以输入的可疑好处。
请勿在新代码中使用它们。
从技术上讲,typedef会引入别名,即已经存在的新名称。这意味着,typedef 不是新类型。类型系统会将它们视为别名类型。
贬低者可以通过阅读精彩的Peter van der Linden书籍 Expert C Programming 来教育自己,其中针对enum / struct / union的typedef案例。