c枚举(typedef enum)的重要性
我最近在为我发布的答案中看到了这一点:c枚举(typedef enum)的重要性,c,C,我最近在为我发布的答案中看到了这一点: typedef enum { NO_OP, ADDITION, } operator_t; int main() { operator_t operator = NO_OP; } 什么是typedef enum?为什么要使用它?我在谷歌上搜索并发现以下内容: 现在,这听起来对我来说有点太技术化了,所以我不明白发生了什么,也不明白为什么人们会使用它 奖金(可选):运算符是什么类型的变量
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
int main()
{
operator_t operator = NO_OP;
}
什么是typedef enum?为什么要使用它?我在谷歌上搜索并发现以下内容:
现在,这听起来对我来说有点太技术化了,所以我不明白发生了什么,也不明白为什么人们会使用它
奖金(可选):运算符是什么类型的变量?
typedef
用于定义现有类型的替代名称。enum
可以这样声明:
enum operator_t
{
NO_OP,
ADDITION,
};
enum operator
{
NO_OP,
ADDITION
};
typedef enum operator operator_t;
然后你可以像这样声明一个变量:
enum operator_t x = NO_OP;
operator_t x = NO_OP;
这有点冗长,因此您可以使用typedef
为此类型定义一个较短的别名:
typedef enum operator_t operator_t;
typedef enum {
STOP,
CAUTION,
GO
} traffic_light_states_t ;
这定义了operator\u t
表示允许您初始化如下变量的类型enum operator\u t
:
enum operator_t x = NO_OP;
operator_t x = NO_OP;
此语法:
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
在一个步骤中完成整个过程,因此它定义了一个(未标记或无标记的)enum
类型,并为其提供别名操作符\u t
另外:
operator\u t
是一种enum
数据类型;请在此处阅读更多信息:typedef和enum是两个不同的概念。您可以像这样重写代码:
enum operator_t
{
NO_OP,
ADDITION,
};
enum operator
{
NO_OP,
ADDITION
};
typedef enum operator operator_t;
第一条语句声明了一个名为操作符
的枚举,它有两个值。第二条语句声明枚举运算符
现在也被称为类型运算符
语法允许将这两条语句组合成一条语句:
typedef enum operator
{
NO_OP,
ADDITION,
} operator_t;
enum operator {
NO_OP,
ADDITION
} op1, op2, op3;
最后,省略枚举的名称,因为它仍然有一个数据类型:
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
枚举、结构和联合的typedef完全是浪费。它们隐藏重要信息的目的是为了节省一些字符以供键入,这一点值得怀疑
不要在新代码中使用它们
从技术上讲,typedef引入了一个别名,即已经存在的事物的新名称。这意味着,typedef不是新类型。类型系统将像对待别名类型一样对待它们
例如,通过阅读彼得·范·德·林登(Peter van der Linden)的著作《C编程专家》(Expert C Programming),选民们可能会对自己进行教育,在这本书中,针对enum/struct/union的typedefs提出了反对的理由
这绝对不是“太技术化”
“”和“”是两个完全不同的东西
使用“枚举”的基本原因是为了避免使用“幻数”:
假设你有三种“状态”:停止、警告和离开。你如何在你的计划中代表他们
一种方法是使用字符串文字“STOP”、“CAUTION”和“GO”。但这有很多问题,包括不能在C“switch/case”块中使用它们
另一种方法是将“它们”映射到整数值“0”、“1”和“2”。这有很多好处。但是在代码中看到“STOP”比看到“0”更有意义。在代码中像这样使用“0”就是一个例子。幻数不好:你想用“有意义的名称”来代替
在语言中引入枚举之前,C程序员使用宏:
#define STOP 0
#define CAUTION 1
#define GO 2
在现代C/C++中,更好、更干净的方法是使用枚举:
enum traffic_light_states {
STOP,
CAUTION,
GO
};
使用“typedef”只会简化此类型变量的声明:
typedef enum operator_t operator_t;
typedef enum {
STOP,
CAUTION,
GO
} traffic_light_states_t ;
什么是typedef enum?为什么要使用它
这里有两种不同的情况:typedef和枚举类型(“enum”)。typedef是一种为类型声明替代名称的机制。枚举类型是一种整数类型,具有一组表示该类型有效值的相关符号常量
首先使用enum,enum声明的完整形式由enum
关键字组成,后跟用于标识特定enum的标记,后跟花括号中的符号enum常量。默认情况下,enum常量对应于从零开始的连续整数值。例如:
enum operator {
NO_OP,
ADDITION
};
如您所见,它与struct
声明有一些相似之处,并且与struct
声明类似,可以在同一语句中声明该枚举类型的变量:
typedef enum operator
{
NO_OP,
ADDITION,
} operator_t;
enum operator {
NO_OP,
ADDITION
} op1, op2, op3;
也可以稍后通过引用枚举的标记来声明它们:
enum operator op4, op5;
与struct
声明类似,标记也可以省略,在这种情况下,枚举类型不能在源代码的其他地方引用(但该类型的任何声明变量仍然可以):
现在我们来看看typedef。正如我已经写的,typedef是为一个类型声明一个替代名称的方法。它的工作原理是将typedef
关键字放在一个本来是变量声明的东西前面;作为变量名的符号就是该类型的替代名称。例如s
typedef unsigned long long int ull_t;
声明ull_t
为类型无符号long long int
的替代名称。此后,这两个类型名称可以互换使用(在typedef声明的范围内)
就你而言,你有
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
它将运算符\u t
声明为给定的无标记枚举类型的别名。以这种方式声明typedef可以通过typedef名称使枚举在其他地方可用,即使枚举是无标记的。这是一种相当常见的机制,用于声明枚举类型的速记名称,对于stru来说,类似的技术也很常见cts也是
奖金(可选):运算符是什么类型的变量
正如我所解释的,运算符t
不是一个变量,它是一种类型。特别是,它是一种枚举类型,符号NO\u OP
和ADDITION
表示该类型的值。维基百科对什么是typedef有很好的讨论
TyPulf是C语言和C++编程语言中的关键字。TyWIFF的目的是从更基本的机器类型中形成复杂类型,并将简单的名称分配给这些组合。