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很简单的就获取了函数的返回类型。
领取专属 10元无门槛券
私享最新 技术干货