Linux C 编程教程第 28 部分 - Typedef
在此页
- C 编程语言中的 Typedef
- 结论
在本教程(正在进行的 C 编程教程系列的一部分)中,我们将讨论 typedef 的概念。顾名思义(将 typedef 视为 type+def),typedef 是 C 提供的工具,用于为现有数据类型定义新名称。
C 语言中的 Typedef
这是一个显示如何使用 typedef 的示例:
typedef int my_int
上面的行——以关键字 typedef 开头——为数据类型 int 赋予了一个新名称:my_int。所以,像这样的代码:
#include <stdio.h>
int main()
{
int a = 10;
printf("The value of a is: %d", a);
return 0;
}
使用我们刚刚讨论的 typedef 示例时,可以像下面这样写:
#include <stdio.h>
typedef int my_int;
int main()
{
my_int a = 10;
printf("The value of a is: %d", a);
return 0;
}
现在,有些人可能会问的一个问题是 typedef 和 #define 之间有什么区别?好吧,虽然两者看起来都在做类似的事情,但实际上两者之间存在很多差异。
首先,typedef 由编译器解释,而 #define 永远不会进入编译阶段,因为它在预处理阶段本身被解释。然后,typedef 遵循作用域规则,而#define 则不遵循。下面是一个这样的例子:
#include <stdio.h>
void my_func();
int main()
{
typedef int my_int;
my_int a = 10;
printf("The value of a is: %d", a);
my_func();
return 0;
}
void my_func()
{
my_int b = 20;
printf("The value of a is: %d", b);
return;
}
执行此代码时,您会收到以下错误:
main.c: In function ‘my_func’:
main.c:25:5: error: unknown type name ‘my_int’
my_int b = 20;
^
如您所见,编译器无法识别 my_func 函数中的 my_int 类型,因为 typedef 有效的范围是 main 函数的范围。
typedef 和#define 之间还有其他一些区别。比如,使用 #define,您还可以为常量值创建别名 - 我的意思是,您可以执行类似 #define PIE 3.14 的操作。此外,正如您所观察到的,#define 不以分号终止,而 typedef 是。
现在,人们仍然会问为什么我们需要 typedef。或者换句话说,typedef 在哪里派上用场?好吧,假设有一段代码的函数返回指向一个函数的指针,该函数接受两个整数作为参数并返回一个字符值。
如果您不知道,这样的指针是通过以下方式声明的:
char (*fn_ptr) (int, int);
其中 fn_ptr 是此类指针的名称。
因此,不必一次又一次地使用这种冗长而复杂的声明作为其他函数的返回类型,您可以使用 typedef 使 fn_ptr 成为一个类型:
typedef char (*fn_ptr) (int, int);
现在你可以只使用 fn_ptr,它会表示一个这种类型的指针。
typedef 的另一个用途涉及在代码中使用用户定义的数据类型,该数据类型对应于运行代码的底层平台提供的本机类型。这样,typedef 有助于轻松理解和维护任何为在多个平台上运行而开发的代码。
结论
因此,在本教程中,我们讨论了 typedef 的基础知识,包括 typedef 的作用、它与 #define 指令的不同之处,以及 typedef 如何通过使代码易于阅读、理解和维护来节省时间。
建议您尝试我们在此处使用的示例并开发更多示例以更好地理解 typedef,并且一如既往,如有任何疑问或疑问,请在下面发表评论。