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)

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积步千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值