如何在 C 中使用 typedef 和 typedef 枚举

  • 本文关键字:typedef 枚举 c typedef
  • 更新时间 :
  • 英文 :


考虑:

#define MAXROW 20
#define MAXCOL 60
typedef State Grid[MAXROW+2] [MAXCOL+2]
typedef enum state {DEAD,ALIVE} State

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

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

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

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

enum state {DEAD, ALIVE} stateVariable;

如果之前已经引入了enum state,则必须这样编写typedef

typedef enum state State;

否则,将重新定义enum,这是一个错误。

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

typedef unsigned long ulong, *ulongptr;
|     | |           | |  1 | |   2   |
|     | |           | |    | ^^^^^^^^^--- "pointer to" declarator
|     | |           | ^^^^^^------------- simple declarator
|     | ^^^^^^^^^^^^^-------------------- specifier-qualifier list
^^^^^^^---------------------------------- storage class specifier

typedef根据说明符限定符列表中给出的unsigned long类型,引入了两个类型名称ulongulongptrulong只是该类型的直接别名。 ulongptr被声明为指向unsigned long的指针,这要归功于*语法,在这个角色中,它是一种类型构造运算符,它故意模仿表达式中使用的指针取消引用的一元*。换句话说,ulongptr是"指向unsigned long指针"类型的别名。

别名表示ulongptrunsigned long *不是不同的类型。这是有效的代码,不需要诊断:

unsigned long *p = 0;
ulongptr q = p;

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

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

unsigned user_id_t uid;  // error! programmer hoped for "unsigned int uid". 

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

#define user_id_t int
unsigned user_id_t uid;

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

它不适用于派生类型的缺点包括:

 #define silly_macro int *
 silly_macro not, what, you, think;

此声明没有将 whatyouthink 声明为"指向 int 的指针"类型,因为宏扩展为:

 int * not, what, you, think;

类型说明符是int,声明符是*notwhatyouthink。因此,not具有预期的指针类型,但其余标识符没有。

这可能是 C 中关于typedef和类型别名的所有内容的 99%。

>typedef定义了一种新的数据类型。因此,您可以拥有:

typedef char* my_string;
typedef struct{
  int member1;
  int member2;
} my_struct;

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

my_string s;
my_struct x;
s = "welcome";
x.member1 = 10;

对于enum,情况有点不同 - 请考虑以下示例:

enum Ranks {FIRST, SECOND};
int main()
{
   int data = 20;
   if (data == FIRST)
   {
      //do something
   }
}

使用 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
   }
}

typedef,只是一个别名 -

  • "typedef是编程语言C和C++中的一个保留关键字。它用于为另一种数据类型创建额外的名称(别名(,但不创建新类型"(Wiki(

 

  • "typedef 声明提供了一种将标识符声明为类型别名的方法,用于替换可能复杂的类型名称"(CPP首选项(

最新更新