首页
学习
活动
专区
工具
TVP
发布

GNU C中typeof两种常用的用法

GCC的C编译器不但支持ANSI C标准,还对C语言进行不少扩展,typeof即为一个很有用的扩展,可以用来构造类型,使用起来比较霸道,通常有以下两种用法。

1. 可以在宏定义中获取变量的类型

比如,比较两个整形变量大小的宏,我们可以如下定义:

#define minint(x, y) ()

但是,如果我们定义一个min宏,并不知道x、y的类型该怎么办呢,这时就用到了typeof,如下所示:

#define min(x, y) ({ \

typeof(x) _min1 = (x); \

typeof(y) _min2 = (y); \

(void) (&_min1 == &_min2); \

_min1

})

typeof(x)和 typeof(y)分别构造了_min1和_min2的类型,分别与x ,y是一样的。(void) (&_min1 == &_min2) 是用来防止x和y的类型不同,有了这句,当x和y的类型不同时,编译器则会给出“comparison of distinct pointer types lacks a cast”的警告。

typeof还可以这样用:

int *x;

typeof (*x) y;

typeof (*x) z[8];

typeof (x) a[4];

typeof (typeof (char *)[4]) b;

第一句和第二句分别等价于int y和int z[8],第三句等价于int *a[4],这是因为*x的类型是int,而x的类型是int *;第四句则申明了一个指针数组,等价于char *d[4]。

2. 定义一个接收函数返回值的变量

如果一个函数的返回类型不明,我们可以使用typeof来定义一个函数返回类型的变量,比如下面一个非常简单的例子:

char *get_name()

{

char *name = (char *)malloc(4);

strcpy(name, "abc");

return name;

}

int main(int argc, char *argv[])

{

typeof(get_name()) rn;

rn = get_name();

printf("name: %s\n", rn);

return 0;

}

变量rn就是使用typeof定义的一个与函数返回类型相同的变量,使用typeof很简单的就获取了函数的返回类型。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200301A0KPGZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券