'typedef' 是一个强大的工具,用于创建新类型的名称(别名),使代码更简短,更方便维护和理解。这个关键字在 C 的早期版本中出现,简化了大型项目开发者的生活,因为冗长的结构和指针声明使代码变得难以阅读和维护。
最初,结构和联合是通过使用关键字 struct、union、enum 的冗长声明来定义的。随着代码的增长,这些声明变得冗余且不方便,这导致了 typedef 的引入,以缩短和标准化类型。
典型错误与对别名的误解、将 typedef 与结构声明混合、匿名结构、指针数组的困难,以及文档未记录的命名约定有关。
'typedef' 允许为现有类型提供简短的名称——无论是基本的还是复合的:
代码示例:
typedef struct Point { int x, y; } Point; Point p1; // 代替 'struct Point p1;' typedef unsigned char byte; byte buffer[8];
关键特性:
1. 可以通过 typedef 创建 "新类型",以使其与基本类型(例如 int)不兼容吗?
不可以。typedef 只是提供别名。编译器级别的类型在本质上仍然是相同的,转换不会导致编译错误。
2. 如果声明 typedef struct {} name_t;,然后 struct name_t var;,结果是什么?
这是一个错误!在 typedef struct MyStruct { ... } Name; 后,使用 Name 来声明变量,而不是 struct Name。struct Name 对编译器未知——这不能这样工作。
3. typedef int arr[10]; arr a,b; a 和 b 的类型是什么?
a 和 b 都是长度为 10 的 int 数组。它们不是指针!如果忘记了 typedef 对数组和指针的特性,错误地期待 'int* a, b'。
在项目中声明 typedef struct User { ... } User;,但使用 struct User my_user; — 编译器报错,代码不可移植。
优点:
缺点:
在整个项目中遵循一个标准:typedef struct {...} Name;,仅使用 Name var; 而不使用 struct。
优点:
缺点: