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的目的是从更基本的机器类型中形成复杂类型,并将简单的名称分配给这些组合。