如何在C中使用typedef和typedef enum?

use*_*555 50 c typedef

考虑:

#define MAXROW 20
#define MAXCOL 60
typedef State Grid[MAXROW+2] [MAXCOL+2]
typedef enum state {DEAD,ALIVE} State
Run Code Online (Sandbox Code Playgroud)

如何使用typedeftypedef enum用C?这部分代码有什么作用?

Kaz*_*Kaz 103

typedef enum state {DEAD,ALIVE} State;
|     | |                     | |   |^ terminating semicolon, required! 
|     | |   type specifier    | |   |
|     | |                     | ^^^^^  declarator (simple name)
|     | |                     |    
|     | ^^^^^^^^^^^^^^^^^^^^^^^  
|     |
^^^^^^^-- storage class specifier (in this case typedef)
Run Code Online (Sandbox Code Playgroud)

typedef关键字是伪存储类说明.从语法上讲,它在使用externstatic使用存储类说明符的相同位置使用.它与存储没有任何关系.这意味着声明不会引入命名对象的存在,而是引入了类型别名的名称.

在上述声明之后,State标识符将成为该类型的别名enum state {DEAD,ALIVE}.声明还提供了类型本身.然而,这不是typedef这样做的.任何enum state {DEAD,ALIVE}显示为类型说明符的声明都会将该类型引入范围:

enum state {DEAD, ALIVE} stateVariable;
Run Code Online (Sandbox Code Playgroud)

如果enum state以前已经介绍过typedef必须这样写:

typedef enum state State;
Run Code Online (Sandbox Code Playgroud)

否则enum正在重新定义,这是一个错误.

与其他声明(函数参数声明除外)一样,typedef声明可以有多个声明符,用逗号分隔.而且,它们可以是派生的声明符,而不仅仅是简单的名称:

typedef unsigned long ulong, *ulongptr;
|     | |           | |  1 | |   2   |
|     | |           | |    | ^^^^^^^^^--- "pointer to" declarator
|     | |           | ^^^^^^------------- simple declarator
|     | ^^^^^^^^^^^^^-------------------- specifier-qualifier list
^^^^^^^---------------------------------- storage class specifier
Run Code Online (Sandbox Code Playgroud)

typedef引入了两个类型名称,ulongulongptr基于unsigned long说明符限定符列表中给出的类型.ulong只是该类型的直接别名.由于语法的原因,它ulongptr被声明为一个指针unsigned long,*在这个角色中是一种类型构造运算符,故意模仿*表达式中使用的指针解引用的一元.换句话说,ulongptr是"指向unsigned long"类型的别名.

别名表示ulongptr 是不是一个独特的类型unsigned long *.这是有效的代码,无需诊断:

unsigned long *p = 0;
ulongptr q = p;
Run Code Online (Sandbox Code Playgroud)

变量qp具有完全相同的类型.

别名typedef不是文本的.例如,如果user_id_ttypedef类型的名称int,我们可能不会简单地这样做:

unsigned user_id_t uid;  // error! programmer hoped for "unsigned int uid". 
Run Code Online (Sandbox Code Playgroud)

这是一个无效的类型说明符列表,unsigned与typedef名称结合使用.以上可以使用C预处理器完成:

#define user_id_t int
unsigned user_id_t uid;
Run Code Online (Sandbox Code Playgroud)

从而在语法分析和翻译之前将user_id_t其宏扩展到令牌int.虽然这似乎是一种优势,但却是假的; 在新程序中避免这种情况.

其中的缺点是它不适用于派生类型:

 #define silly_macro int *

 silly_macro not, what, you, think;
Run Code Online (Sandbox Code Playgroud)

这个声明没有声明what,you并且think因为宏扩展是:"是指向int的类型":

 int * not, what, you, think;
Run Code Online (Sandbox Code Playgroud)

该类型说明符是int,和说明符*not,what,youthink.所以not有预期的指针类型,但是剩余的标识符不.

这可能是99%的一切,typedef并在C中键入别名.

  • 上帝般的ASC艺术技能+2。 (2认同)

Pan*_*rei 24

typedef定义新的数据类型.所以你可以:

typedef char* my_string;
typedef struct{
  int member1;
  int member2;
} my_struct;
Run Code Online (Sandbox Code Playgroud)

所以现在你可以使用这些新数据类型声明变量

my_string s;
my_struct x;

s = "welcome";
x.member1 = 10;
Run Code Online (Sandbox Code Playgroud)

因为enum,事情有点不同 - 请考虑以下示例:

enum Ranks {FIRST, SECOND};
int main()
{
   int data = 20;
   if (data == FIRST)
   {
      //do something
   }
}
Run Code Online (Sandbox Code Playgroud)

using typedef enum为类型创建别名:

typedef enum Ranks {FIRST, SECOND} Order;
int main()
{
   Order data = (Order)20;  // Must cast to defined type to prevent error

   if (data == FIRST)
   {
      //do something
   }
}
Run Code Online (Sandbox Code Playgroud)

  • `typedef`没有定义新的数据类型; 它定义了现有数据类型的标识符. (7认同)
  • 将`typedef`与枚举一起使用不会影响枚举的属性.你的第二对例子:首先它是一个红色的鲱鱼,在第一个你可以编写`enum Ranks data = 20;`而不是`int data = 20;`.但在这两种情况下,允许将"20"分配给枚举类型的变量,这不是错误. (2认同)