c枚举的重要性(typedef enum)

时间:2015-12-16 22:14:39

标签: c

我最近在为我发布的答案中看到了这一点:

    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是什么类型的变量?

6 个答案:

答案 0 :(得分:13)

  1. 绝对不是“太技术化”。

  2. typedef”和“enum”是完全不同的两件事。

  3. 拥有“枚举”的基本原因是避免“魔术数字”:

    假设你有三个“状态”:STOP,CAUTION和GO。你如何在你的计划中代表他们?

    一种方法是使用字符串文字“STOP”,“CAUTION”和“GO”。但这有很多问题 - 包括你不能在C“开关/案例”块中使用它们。

    另一种方法是将它们映射到整数值“0”,“1”和“2”。这有很多好处。但在代码中看到“停止”比看到“更有意义” 0“。在你的代码中使用”0“是一个”magic number“的例子。幻数是坏的:你想要使用”有意义的名字“。

  4. 在使用该语言介绍枚举之前,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_tenum数据类型;在此处详细了解: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_OPADDITION代表该类型的值。

答案 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案例。