typeof 关键字的作用

目录

1、typeof 关键字是什么、有什么作用?

2、typeof 使用示例

3、typeof 的高级用法

4、typeof 在 Linux 内核中使用的实例


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)

猜你喜欢

转载自blog.csdn.net/m0_37383484/article/details/129186186