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为此类声明分配快捷别名 -
typedefsigned 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 Size 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 ", 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 ", u1.a, u1.b, u1.c); printf("a:%c b: %d c: %lf ", 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 Age: %d", e1.name, e1.age); return 0; }
输出
运行此代码时,将产生以下输出 -
Name: Krishna Age: 25