C语言中的typedef



C typedef

C编程语言提供了一个名为typedef的关键字,用于为现有的数据类型设置一个替代名称。C语言中的typedef关键字在为内置数据类型以及任何派生数据类型(如结构体、联合体或指针)分配一个方便的别名方面非常有用。

有时,每次声明变量时使用较长的名称(例如“struct structname”或“unsigned int”)的数据类型会变得很麻烦。在这种情况下,我们可以分配一个方便的快捷方式,使代码更具可读性。

typedef语法

通常,typedef关键字的使用方式如下:

typedef existing_type new_type;

typedef示例

在本章中,让我们看一下typedef的一些用例。

示例1

在C语言中,关键字“unsigned”用于声明只能存储非负值的无符号整数变量

C还有一个名为“short”的关键字,它声明一个占用2个字节内存的整数数据类型。如果要声明一个既是short又只能具有非负值的变量,则可以组合这两个关键字(unsigned和short)

short unsigned int x;

如果要声明许多此类型的变量,则每次都使用这三个关键字将不太方便。相反,您可以使用typedef关键字定义一个别名或快捷方式,如下所示:

typedef short unsigned int USHORT;

这告诉编译器标识符USHORT对应于“short unsigned int”类型。此后,您可以在变量声明语句中使用USHORT

USHORT x;

示例2

C还具有关键字static,用于指示此类变量仅初始化一次。“long”关键字在64位系统上分配8个字节来存储整数。我们可以如下声明此类型的变量:

static unsigned long x;

但是,我们不能在“typedef”语句中使用关键字“static”,但是我们可以使用typedef为这种类型的声明分配一个快捷别名:

typedef signed long SLONG;
static SLONG x;

注意:按照约定,别名以大写字母表示,只是为了区分内置类型和使用的别名。

示例3

以下示例演示了如何在C程序中使用别名:

#include <stdio.h>

int main() {
   typedef short unsigned int USHORT;
   typedef signed long int SLONG;

   static SLONG x = 100;
   USHORT y = 200;

   printf("Size of SLONG: %d \nSize of USHORT: %d", sizeof(SLONG), sizeof(USHORT));
   
   return 0;
}

输出

运行此代码时,将产生以下输出:

Size of SLONG: 8 
Size of USHORT: 2

使用Typedef定义结构体

通常,我们需要通过在声明语句中添加struct_type的名称前缀来声明结构体变量,如下所示:

struct struct_type var;

如果以这种方式编写类型名称感觉很麻烦,则可以使用typedef分配一个别名:

typedef struct struct_type ALIAS;

示例

在此示例中,我们定义了一个结构体类型,然后使用typedef关键字为其设置一个别名:

#include <stdio.h>

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   struct mystruct {
      ULONG a;
      SHORT b;
   };

   typedef struct mystruct STR;
   STR s1 = {10, 20};
   printf("%ld %u", s1.a, s1.b);

   return 0;
}

输出

运行代码并检查其输出:

10 20

可以使用typedef关键字的另一种方法。我们可以将其与结构体定义本身结合起来,如下所示:

typedef struct mystruct {
   ULONG a;
   SHORT b;
} STR;

STR s1 = {10, 20};

结构体指针的Typedef

typedef关键字也可用于为任何指针类型分配新的标识符。通常,我们如下声明指针变量:

struct mystruct * x;

相反,我们可以使用typedef关键字,如下所示:

typedef struct mystruct {
   ULONG a;
   SHORT b;
} STR;

typedef STR * strptr;

它允许您以更简洁的方式声明此类型的指针:

strptr ptr;

然后,我们可以将相应struct变量的地址分配给指针。

示例

以下示例显示了如何使用typedef创建结构体指针:

#include <stdio.h>

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   typedef struct mystruct {
      ULONG a;
      SHORT b;
   } STR;

   STR s1 = {10, 20};
   typedef STR * strptr;
   strptr ptr = &s1;

   printf("%d %d \n", s1.a, s1.b);
   printf("%d %d", ptr->a, ptr->b);

   return 0;
}

输出

运行此代码时,将产生以下输出:

10 20 
10 20

联合体的Typedef

我们可以使用typedef关键字为任何联合体类型分配快捷别名。

示例

以下示例说明了如何在创建联合体时使用typedef

#include <stdio.h>

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   typedef union myunion {
      char a;
      int b;
      double c;
   } UNTYPE;

   UNTYPE u1;
   u1.c = 65.50;

   typedef UNTYPE * UNPTR;
   UNPTR ptr = &u1;

   printf("a:%c b: %d c: %lf \n", u1.a, u1.b, u1.c);
   printf("a:%c b: %d c: %lf \n", ptr->a, ptr->b, ptr->c);

   return 0;
}

输出

运行代码并检查其输出:

a: b: 0 c: 65.500000
a: b: 0 c: 65.500000

C语言中的typedef与#define

typedef关键字经常与#define指令混淆。在C语言中,#define预处理器指令。它是定义常量的一种有效方法。

使用#define语法如下:

#define name value

例如:

#define PI 3.14159265359

#define语句也可用于定义宏:

#define SQUARE(x) x*x

宏的工作原理类似于函数。但是,在调用时,值会在预处理器级别被替换。

printf("%d", SQUARE(5));

#define是预处理器指令,而typedef在编译时进行评估。

  • typedef仅限于为类型赋予符号名称。#define也可用于为值定义别名。例如,您可以将“1”定义为“ONE”。
  • typedef的解释由编译器执行,而#define语句由预处理器处理。

示例

在以下代码中,我们同时使用了这两个功能(typedef#define):

#include <stdio.h>
#define MAX 10

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   typedef struct employee {
      char name[MAX];
      int age;
   } EMP;

   EMP e1 = {"Krishna", 25};
   printf("Name: %s \nAge: %d", e1.name, e1.age);

   return 0;
}

输出

运行此代码时,将产生以下输出:

Name: Krishna 
Age: 25
广告