linux内核中的typeof
来源:互联网 发布:php数组添加元素的函数 编辑:程序博客网 时间:2024/05/23 21:57
http://blog.csdn.net/ce123_zhouwei/article/details/8458114
http://blog.chinaunix.net/uid-20758472-id-1876971.html
今天分析内核时又看到了typeof,只知道它大概是返回变量的类型,后来上网查了下发现这个关键字在linux中用的非常多。如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp)返回的是exp的数据类型大小,那么typeof(exp.)返回的就是exp的数据类型。下面是linux内核中typeof的一些例子。include/linux/kernel.h
- /*
- * min()/max() macros that also do
- * strict type-checking.. See the
- * "unnecessary" pointer comparison.
- */
- #define min(x,y) ({ \
- typeof(x) _x = (x); \ //_x的数据类型和x一样
- typeof(y) _y = (y); \
- (void) (&_x == &_y); \
- _x < _y ? _x : _y; })
- #define max(x,y) ({ \
- typeof(x) _x = (x); \
- typeof(y) _y = (y); \
- (void) (&_x == &_y); \
- #define get_user(x,p) \
- ({ \
- const register typeof(*(p)) __user *__p asm("r0") = (p);\ //__p的数据类型和*(p)的指针数据类型是一样的,__p = p
- register typeof(*(p)) __r2 asm("r2"); \ //__r2的数据类型和*(p)的数据类型是一样的
- register int __e asm("r0"); \
- switch (sizeof(*(__p))) { \
- case 1: \
- __get_user_x(__r2, __p, __e, 1, "lr"); \
- break; \
- case 2: \
- __get_user_x(__r2, __p, __e, 2, "r3", "lr"); \
- break; \
- case 4: \
- __get_user_x(__r2, __p, __e, 4, "lr"); \
- break; \
- case 8: \
- __get_user_x(__r2, __p, __e, 8, "lr"); \
- break; \
- default: __e = __get_user_bad(); break; \
- } \
- x = __r2; \
- __e; \
- })
- #include <stdio.h>
- typedef struct
- {
- int x;
- char y;
- }astruct, * pastrcut;
- int main()
- {
- int sizem, sizew;
- int x = 3;
- typeof(&x) m = &x;
- sizem = sizeof(m);
- *m = 5;
- typeof(((astruct *)5)->y) w;
- sizew = sizeof(w);
- w = "a";
- return 1;
- }
首先看main函数里的m变量,这个变量的类型就是typeof(&x), 由于x是int型的(这里与x是否被赋值一点关系都没有),所以&x应该是int *类型,那么typeof(&x)返回的类型就是int*,所以m自然也就是个int*类型的。
然后我们看w变量,其类型是 typeof(((astruct *)5)->y), 其中astruct是一个被定义的结构类型,其中的y元素是char类型,那么((astruct *)5)->y是啥意思呢?在这里5并不是真正的变量,可以把它理解为一个替代使用的符号,当然这个符号最好是一个数,其意思更可以理解为一个被赋值了的变量,这个数可以是0,3,也可以是8也可以随便什么都可以。那么((astruct *)5)->y仅仅就是表示了y这个变量,所以typeof的结果就是y元素的类型,也就是char。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------typeof关键字是C语言中的一个新扩展。只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别:
- 声明
- 函数声明符中的参数类型链表和返回类型
- 类型定义
- 类型操作符s
- sizeof操作符
- 复合文字
- typeof实参
编译器接受带双下划线的关键字:__typeof和__typeof__。本文中的例子并没有遵循使用双下划线的惯例。从语句构成上看,typeof关键字后带圆括号,其中包含类型或表达式的名称。这类似于sizeof关键字接受的操作数(与sizeof不同的是,位字段允许作为typeof实参,并被解释为相应的整数类型)。从语义上看,typeof 关键字将用做类型名(typedef名称)并指定类型。
使用typeof的声明示例
下面是两个等效声明,用于声明int类型的变量a。
typeof(int) a; /* Specifies variable a which is of the type int */
typeof('b') a; /* The same. typeof argument is an expression consisting of
character constant which has the type int */
以下示例用于声明指针和数组。为了进行对比,还给出了不带typeof的等效声明。
typeof(int *) p1, p2; /* Declares two int pointers p1, p2 */
int *p1, *p2;
typeof(int) * p3, p4;/* Declares int pointer p3 and int p4 */
int * p3, p4;
typeof(int [10]) a1, a2;/* Declares two arrays of integers */
int a1[10], a2[10];
如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达式不会被执行,所以不会调用foo函数。
extern int foo();
typeof(foo()) var;
使用typeof的声明限制
请注意,typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。例如,下列代码是无效的,因为它在typeof构造中声明了extern:
typeof(extern int) a;
下列代码使用外部链接来声明标识符b是有效的,表示一个int类型的对象。下一个声明也是有效的,它声明了一个使用const限定符的char类型指针,表示指针p不能被修改。
extern typeof(int) b;
typeof(char * const) p = "a";在宏声明中使用typeof
typeof构造的主要应用是用在宏定义中。可以使用typeof关键字来引用宏参数的类型。因此,在没有将类型名明确指定为宏实参的情况下,构造带有所需类型的对象是可能的。
- linux内核中的typeof
- linux内核中的typeof
- linux中的typeof使用
- linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)
- linux内核中typeof的使用说明
- linux内核细节- typeof、offsetof、container_of
- Linux typeof
- js中的typeof作用
- javascript 中的typeof
- C#中的typeof关键字
- C语言中的typeof
- C中的typeof & type
- C语言中的typeof
- javascript中的typeof
- JS中的typeof
- java script中的typeof
- Linux内核中的汇编语言
- Linux内核中的汇编语言
- java 字节流与字符流的区别
- Accelerated C++ 习题解答 第12章
- 带碰撞检测的摄像机
- 别让6种不良心理偷走你的好人缘
- Eclipse php快捷键大全
- linux内核中的typeof
- PreparedStatement的用法
- 下载量已超越千万的爆红游戏2048(同名小3传奇、1024)源代码解密和下载(第一篇)
- 【ZJOI2008】树的统计
- 时间管理和思考
- opencv系列之~~~简单图片处理函数的使用
- 电流源短路 仍然起作用
- ubuntu解压rar压缩文件
- 【并查集】 hdu 1856 More is better