目录
1、typeof 关键字是什么、有什么作用?
熟悉 C 语言的基本知道,ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数。
typeof 是 GNU C 扩展的一个关键字,用来获取一个变量或表达式的类型。在这里称之为关键字可能不太合适,毕竟 typeof 还没有被正式写入 C 标准,只是 GCC 扩展的一个关键字而已。不过为了学习方便,我们就暂且称之为关键字吧。
通过使用 typeof,我们可以获取一个变量或表达式的类型。所以 typeof 的参数有两种形式:表达式或类型。先来简单体会一下 typeof 的用途:
int i = 0;
typeof(i) j = 20; //typeof(i) j = 20 相当于 int j = 20
typeof(int *) a; //typeof(int *) a; 相当于 int * a;
int func();
typeof(f()) k; //typeof(func()) k; 相当于 int k;
在上面的代码中,可以看出:
1. 因为变量 i 的类型为 int,所以 typeof(i) 就等于 int,typeof(i) j =20 就相当于 int j = 20
2. typeof(int *) a; 相当于 int * a;
3. 函数也是有类型的,函数的类型即其返回值类型,所以 typeof(f()) k; 就相当于 int k;
2、typeof 使用示例
根据上面 typeof 的用法说明,我们可以编写一个程序来学习一下 typeof 的用途。
int main(void)
{
int i = 2; //声明变量 i 为 int 类型
typeof(i) k = 6; //使用 typeof(i) 获取变量 i 类型,其等价于 int k = 6;
int *p = &k; //声明变量 p 为 int 类型的指针
typeof(p) q = &i; //使用 typeof(p) 获取指针变量 p 类型,其等价于 int *q = &i;
printf("k = %d\n", k);
printf("*p = %d\n", *p);
printf("i = %d\n", i);
printf("*q = %d\n", *q);
return 0;
}
以上程序的运行结果为:
k = 6
*p = 6
i = 2
*q = 2
通过运行结果可知,通过 typeof 获取一个变量的类型 int 后,可以使用该类型再定义一个变量。这跟我们直接使用 int 定义一个变量,效果是一样的。
3、typeof 的高级用法
除了使用 typeof 获取基本数据类型,还有其它一些高级的用法:
(1)typeof (int *) y; //把 y 定义为指向 int 类型的指针,相当于 int * y;
(2)typeof (int) *y; //定义一个执行 int 类型的指针变量 y;
(3)typeof (*x) y; //定义一个指针 x 所指向类型的指针变量 y;
(4)typeof (int) y[8]; //相当于定义了一个:int y[8];
(5)typeof (*x) y[8]; //把 y 定义为指针 x 指向的数据类型数组;
(6)typeof (typeof (char *)[8]) y; //相当于定义字符指针数组:char *y[8];
(7)typeof (int x[8]) y; //相当于定义:int y[8];
4、typeof 在 Linux 内核中使用的实例
关键字 typeof 在 Linux 内核中被广泛使用,主要用在宏定义中,用来获取宏参数类型。
以下是通过 typeof 直接获取宏的参数类型,来实现数据交换的实例:
#define swap(a, b) \
do { \
typeof(a) __tmp = (a); \
(a) = (b); \
(b) = __tmp; \
} while (0)