C语⾔⾼级⽤法---typeof()关键字
前⾔
typeof() 是GUN C提供的⼀种特性,可参考,它可以取得变量的类型,或者表达式的类型。
本⽂总结了typeof()关键字的常见⽤法,并给出了相应的例⼦,以加深理解 。
typeof()关键字常见⽤法
typeof()关键字常见⽤法⼀共有以下⼏种。
1. 不⽤知道函数返回什么类型,可以使⽤typeof()定义⼀个⽤于接收该函数返回值的变量
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct apple{
int weight;
int color;
};typeof的用法
struct apple *get_apple_info()
{
struct apple *a1;
a1 =malloc(sizeof(struct apple));
if(a1 ==NULL)
{
printf("malloc error.\n");
return;
}
a1->weight =2;
a1->color =1;
return a1;
}
int main(int argc,char*argv[])
{
typeof(get_apple_info()) r1;//定义⼀个变量r1,⽤于接收函数get_apple_info()返回的值,由于该函数返回的类型是:struct apple *,所以变量r1也是该类型。注意,函数不会执⾏。
r1 =get_apple_info();
printf("apple weight:%d\n", r1->weight);
printf("apple color:%d\n", r1->color);
return0;
}
2. 在宏定义中动态获取相关结构体成员的类型
如下代码,定义⼀个和变量x相同类型的临时变量_max1,定义⼀个和变量y相同类型的临时变量_max2,再判断两者类型是否⼀致,不⼀致给出⼀个警告,最后⽐较两者。
#define max(x, y) ({ \
typeof(x) _max1 = (x); \
typeof(y) _max2 = (y); \
(void) (&_max1 == &_max2); \//如果调⽤者传参时,两者类型不⼀致,在编译时就会发出警告。
_max1 > _max2 ? _max1 : _max2;})
如下代码,传⼊的a和b不是同⼀类型。
int main(int argc,char*argv[])
{
int a=3;
float b =4.0;
int r =max(a, b);
printf("r:%d\n", r);
return0;
}
此时编译就会出现警告
[root@xx c_base]# gcc test.c
test.c: 在函数‘main’中:
test.c:43: 警告:⽐较不相关的指针时缺少类型转换
3. 也可直接取得已知类型
如下代码,定义了⼀个int类型的指针p,像这种⽤法主没什么太⼤的意义了。
int a =2;
typeof(int*) p;
p =&a;
printf("%d\n",*p);
4. 其它⽤法
//其它⽤法1
char*p1;
typeof(*p1) ch ='a';//ch为char类型,不是char *类型。
printf("%d, %c\n",sizeof(ch), ch);//1, a
/
/其它⽤法2
char*p2;
typeof(p2) p ="hello world";//此时的p才是char *类型,由于在64位机器上,所以指针⼤⼩为8字节
printf("%d, %s\n",sizeof(p), p);//8, hello world
总结
以上例⼦并没有穷举所有的情况,但其核⼼⽤法基本上就会了,其它的例⼦也可参考⽹上的例⼦。参考⽂章
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论