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()关键字的更多相关文章

  1. typeof关键字简介 -rtti

    typeof关键字是C语言中的一个新扩展.只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别: 声明 函数声明符中的参数类型链表和返回类 ...

  2. typeof关键字的作用

    http://blog.chinaunix.net/uid-28458801-id-4200573.html 一.typeof详解: 前言:    typeof关键字是C语言中的一个新扩展,这个特性在 ...

  3. typeof关键字

    C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 使用方法 1.当x的类型为是 int 时 _min1变量的数据类型则为 int. 2.当x为一个表达式时(例 ...

  4. c语言中typeof关键字

    为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量atypeof ...

  5. C#中使用typeof关键字和GetType()获取类的内部结构(反射机制)

    一.问题描述 java有反射机制,C#也有反射机制,在C#中typeof关键字用于获取类型的System.Type对象,该对象的GetMethods()方法可以得到类型中定义的方法对象的计集合,调用方 ...

  6. TypeScript 0.9.1 发布,新增 typeof 关键字

    TypeScript 0.9.1 发布了,该版本提升了编译器和语言的性能,增加新的语言特性 typeof ,更好的 this 处理等.详细介绍请看发行说明. TypeScript 是微软新推出的一种语 ...

  7. 023使用typeof关键字获取类内部结构

    private void button1_Click(object sender, EventArgs e) { Focus(); string a=txtType.Text; // Type typ ...

  8. linux内核宏container_of前期准备之gcc扩展关键字typeof

    typeof基本介绍 typeof(x) 这是它的使用方法,x可以是数据类型或者表达式.它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会 ...

  9. C语言typeof详解 offsetof

    http://blog.chinaunix.net/uid-28458801-id-4200573.html 前言:    typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常 ...

随机推荐

  1. Codeforces 788C The Great Mixing(背包问题建模+bitset优化或BFS)

    [题目链接] http://codeforces.com/problemset/problem/788/C [题目大意] 给出一些浓度的饮料,要求调出n/1000浓度的饮料,问最少需要多少升饮料 [题 ...

  2. 手动编译含package的java源程序(包含外部包中定义的类)

    1)定义一个GSM类,如下: 包名是“SRC.GSM”,并且此程序引用了外部jar包.使用javac命令对GSM.java进行编译: GSM.java所在的文件夹如下所示: 切换到这个目录为当前工作目 ...

  3. Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

    /** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...

  4. angularjs+requirejs整合

    通过requirejs的配置让angularJS可以正常运行.以下是配置的步骤: 环境需求 require.js angular.js 有了这两文件,就可以进行下一步了,具体将文件放到哪个目录,可以跟 ...

  5. 关于数字、数据处理的几个PHP函数汇总

    1. / 得到的结果是浮点数 2. % 求余数 3.ceil():得到大于当前数字的整数 $num=3.4; $num=ceil($num); echo $num;   的到的结果是4 $num=3. ...

  6. php实现简单视图模板(视图引擎)

    视图 视图,你所看见的部分. <?php echo 'hello, world'; 从简单开始理解 这就是个视图文件中的代码,没错就这么简单.视图,实际上是在 MVC 这种架构上提出的.MVC ...

  7. 安装Node.js、npm和环境变量的配置

    由于Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境. 一.安装Node.js 首先,从Node.js官网下载对应平台的安装程序,网速慢的童鞋请移步国内镜像 ...

  8. kubelet分析

    kubelet是k8s中节点上运行的管理工具,它负责接受api-server发送的调度请求,在Node上创建管理pod,并且向api-server同步节点的状态.这篇文章主要讲讲kubelet组件如何 ...

  9. 2017.11.15 String、StringBuffer、StringBuilder的比较(todo)

    参考来自:http://blog.csdn.net/jeffleo/article/details/52194433 1.速度 一般来说,三者的速度是:StringBuilder > Strin ...

  10. js动态创建和删除option

    1.动态创建select function createSelect(){           var mySelect = document.createElement("select&q ...