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. JNI概述

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++). JNI 让你在利用强大 Java 平台的同时,使你仍然可以用 ...

  2. 使用.Net中的WeakDictionary — ConditionalWeakTable

    有的时候,我们需要给某些数据添加一些附加信息,一种常用的做法是使用一个Dictionary在填充这些附加信息如: var data = new Data();    var tag = new Tag ...

  3. PHP线程安全和非线程安全的区别

    Windows版的PHP从版本5.2.1开始有Thread Safe.这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. 从2000年10月20日发布的第一个Windows版的PHP3.0.1 ...

  4. eth0: ERROR while getting interface flags: No such device

    出现这个问题有两种原因: 虚拟机设置中没有添加对应的网卡 更改了虚拟机中网卡的MAC,但是Debian 的缓存中将eth0与上次的MAC对应 解决方法: 这里仅就第二种问题提出解决方案: 删除/etc ...

  5. Git -- 自己项目关联新建的git

  6. WebLogic Server 多租户资源管理(resource consume manager)

    WebLogic Server基于分区管理heap Size,CPU利用率等,具体的设置如下, 首先需要在setDomainEnv.cmd文件中java_option中加入如下字段 -XX:+Unlo ...

  7. git新建和删除远程分支

    创建远程分支: 新建本地分支 git checkout -b branch_name 推送到远程分支,分支名字和本地分支名字相同 git push origin branch_name:branch_ ...

  8. Linux Bash严重漏洞修复方法

    日前Linux官方内置Bash中新发现一个非常严重安全漏洞,黑客可以利用该Bash漏洞完全控制目标系统并发起攻击,为了避免Linux服务器受影响,就要尽快修补该漏洞了.(漏洞参考https://acc ...

  9. 常见Hibernate报错处理:出现“org.hibernate.QueryException: could not resolve property”和 is not mapped和could not locate named parameter错误的解决

    正确写法: @Override @SuppressWarnings("unchecked") public List<Device> queryOSDevice(Str ...

  10. Android Handler,Loop,HandlerThread消息处理

    博客标题也不知道写什么好,仅仅是近期有时候发现Handler,Loop,HandlerThread非常easy混淆,所以做了简单的笔记处理: 第一种 : 大概的意思给出说明图: watermark/2 ...