typeof()关键字
typeof是GNU c标准的关键字。
typeof()的作用是自动推导出括号中表达式的数据类型。
- #include <stdio.h>
- void func1(void)
- {
- int a = ;
- typeof(int *)pa = &a;//pa的数据类型为int型的指针
- printf("pa:\t%p\n", pa);
- printf("&a:\t%p\n", &a);
- printf("a:\t%d\n", a);
- printf("*pa:\t%d\n", *pa);
- }
- void func2(void)
- {
- int b = ;
- typeof(&b)pb = &b;//&b的数据类型为int*,所以pb的类型为int*。
- printf("pb:\t%p\n", pb);
- printf("&b:\t%p\n", &b);
- printf("b:\t%d\n", b);
- printf("*pb:\t%d\n", *pb);
- }
- void func3(void)
- {
- int* pc = NULL;
- typeof(*pc) c = ;//pc的类型为int*,那么,*pc的类型即为int
- printf("c=%d\n",c);
- }
- void func4(void)
- {
- int i = ;
- int* pc = NULL;
- typeof(*pc) arr[] = {,,,};//同样,*pc的类型为int
- for(i = ; i < ; ++i)
- printf("arr[%d]=%d\n", i, arr[i]);
- }
- void func5(void)
- {
- int i = ;
- typeof(typeof(const char *)[]) pchar = {"hello", "world", "good", "night"};
//里层typeof的类型为const char*,和外层结合后,pchar的数据类型即为const char*指针数组- for (i = ; i < ; i++)
- printf("pchar[%d]:%s\n", i, pchar[i]);
- }
- int add(int param1, int param2)
- {
- return param1 + param2;
- }
- int sub(int param1, int param2)
- {
- return param1 - param2;
- }
- int mul(int param1, int param2)
- {
- return param1 * param2;
- }
- void func6(void)
- {
- int (*func[]) (int, int) = {add, sub, mul};//显然func的数据类型为函数指针数组,数组元素为函数指针。
- typeof(func[](, )) sum = ; //func[0](1,1)===>add(1,1)===>2,即 typeof(2)sum = 100;
- typeof(func[](, )) dif = ;
- typeof(func[](, )) pro = ;
- printf("sum:%d\n", sum);
- printf("dif:%d\n", dif);
- printf("pro:%d\n", pro);
- }
- #define pointer(T) typeof(T *)
- #define array(T, N) typeof(T[N])
- void func7(void)
- {
- int i = ;
- array(pointer(char), ) pchar = {"hello", "world", "good", "night"};
- for (i = ; i < ; i++)
- printf("pchar[%d]:%s\n", i, pchar[i]);
- }
- //from linux-3.5/include/linux/kernel.h
- #define min(x, y) ({ \
- typeof(x) _min1 = (x); \
- typeof(y) _min2 = (y); \
- (void)(&_min1 == &_min2); \
- _min1 < _min2 ? _min1 : _min2; })
- int main(int argc, char** argv)
- {
- int a = ;
- //char b = 2;
- int b = ;
- func1();
- func2();
- (void);
- printf("%d\n",min(a,b));
- func3();
- func4();
- func5();
- func6();
- func7();
- return ;
- }
附加知识点:
line 92包含两个知识点,
1.warning: statement with no effect
c语言中语句(statement)的用法,
正如104行,如果是 "12;"gcc编译时加上-Wall参数(高版本gcc可能不会报警告),会报warning: statement with no effect,即无效的语句。
2.warning: comparison of distinct pointer types lacks a cast
如果将106行中的b的数据类型改为char,编译时就会报出警告。
- (&_min1 == &_min2);通过这种方式可以判断两个变量的类型是否一致。
typeof()关键字的更多相关文章
- typeof关键字简介 -rtti
typeof关键字是C语言中的一个新扩展.只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别: 声明 函数声明符中的参数类型链表和返回类 ...
- typeof关键字的作用
http://blog.chinaunix.net/uid-28458801-id-4200573.html 一.typeof详解: 前言: typeof关键字是C语言中的一个新扩展,这个特性在 ...
- typeof关键字
C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 使用方法 1.当x的类型为是 int 时 _min1变量的数据类型则为 int. 2.当x为一个表达式时(例 ...
- c语言中typeof关键字
为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量atypeof ...
- C#中使用typeof关键字和GetType()获取类的内部结构(反射机制)
一.问题描述 java有反射机制,C#也有反射机制,在C#中typeof关键字用于获取类型的System.Type对象,该对象的GetMethods()方法可以得到类型中定义的方法对象的计集合,调用方 ...
- TypeScript 0.9.1 发布,新增 typeof 关键字
TypeScript 0.9.1 发布了,该版本提升了编译器和语言的性能,增加新的语言特性 typeof ,更好的 this 处理等.详细介绍请看发行说明. TypeScript 是微软新推出的一种语 ...
- 023使用typeof关键字获取类内部结构
private void button1_Click(object sender, EventArgs e) { Focus(); string a=txtType.Text; // Type typ ...
- linux内核宏container_of前期准备之gcc扩展关键字typeof
typeof基本介绍 typeof(x) 这是它的使用方法,x可以是数据类型或者表达式.它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会 ...
- C语言typeof详解 offsetof
http://blog.chinaunix.net/uid-28458801-id-4200573.html 前言: typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常 ...
随机推荐
- CentOS 6.9系统时间和硬件时间设置(转)
总结一下hwclock,这个容易晕: 1)/etc/sysconfig/clock 文件,只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用(修改了其中的 UTC=true 到 UTC= ...
- javascript如何写一个for循环
一个非常简单的for循环,也有不少的学问.假如,我们的目标是要遍历一个dom结点的所有孩子结点,然后打印结点的内容. 在javascript下,我刚学习的时间,我会这样写. for(var i = 0 ...
- sql-server-on-linux-how-i-think-they-did-it : Anthony Nocentino's Blog
http://www.sqlservercentral.com/blogs/anthony-nocentinos-blog/2016/11/21/sql-server-on-linux-how-i-t ...
- SQL Server Wait Types Library
https://www.sqlskills.com/blogs/paul/announcing-the-comprehensive-sql-server-wait-types-and-latch-cl ...
- sql server博客
SQLSERVER MSDN论坛 SQLSERVER 补丁博客 SQLSERVER中国研发中心 微软亚太区数据库技术支持组官方博客 PAUL的SQLSKILL网站 sqlsaturday网站 sqls ...
- LNMP第二部分nginx、php配置
内容概要:一. nginx.confvim /usr/local/nginx/conf/nginx.conf //清空原来的配置,加入如下内容:user nobody nobody;worker_pr ...
- GyoiThon:基于机器学习的渗透测试工具
简介 GyoiThon是一款基于机器学习的渗透测试工具. GyoiThon根据学习数据识别安装在Web服务器上的软件(操作系统,中间件,框架,CMS等).之后,GyoiThon为已识别的软件执行有效的 ...
- GLEW扩展库【转】
http://blog.sina.com.cn/s/blog_4aff14d50100ydsy.html 一.关于GLEW扩展库: GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口.使用O ...
- http://blog.csdn.net/szwangdf/article/details/23432783
http://blog.csdn.net/szwangdf/article/details/23432783
- Spark streaming + Kafka 流式数据处理,结果存储至MongoDB、Solr、Neo4j(自用)
KafkaStreaming.scala文件 import kafka.serializer.StringDecoder import org.apache.spark.SparkConf impor ...