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. 【贪心】Gym - 100507H - Pair: normal and paranormal

    每次取相邻的两个可以射击的从序列中删除,重复n次. 可以看作括号序列的匹配. #include<cstdio> #include<vector> using namespace ...

  2. 【后缀数组】【线段树】poj3974 Palindrome

    考虑奇数长度的回文,对于字符串上的每个位置i,如果知道从i开始的后缀和到i为止的前缀反转后的字符串的lcp长度的话,也就知道了以第i个字符为对称中心的最长回文的长度了.因此,我们用在S中不会出现的字符 ...

  3. 【主席树】bzoj2588 Spoj 10628. Count on a tree

    每个点的主席树的root是从其父转移来的.询问的时候用U+V-LCA-FA(LCA)即可. #include<cstdio> #include<algorithm> using ...

  4. 【最大流】【Dinic】bzoj1711 [Usaco2007 Open]Dingin吃饭

    把牛拆点,互相连1的边. 把牛的食物向牛连边,把牛向牛的饮料连边. 把源点向牛的食物连边,把牛的饮料向汇点连边. 要把牛放在中间,否则会造成一头牛吃了自己的食物后又去喝别的牛的饮料的情况. #incl ...

  5. Delphi 7生成XML

    文件格式为: Day 制1課 U12 ASSY01 Wrist 1009 0 2018/05/18 09:35:59 Day 制1課 U12 ASSY02 Wrist 1010 0 2018/05/1 ...

  6. 在xcode6中使用矢量图(iPhone6置配UI)

    转载出处:http://blog.xoneday.com ios应用程序是一个图像主导的产品.在开发一个应用程序时,你需要各种尺寸的图标,你需要为每个图像文件制作一个@1x尺寸和一个@2x尺寸.这样你 ...

  7. mq

    同时每个 Broker 与NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer 中. Producer 与 NameServer 集群中的其中一个节 ...

  8. Protostuff序列化工具类

    源代码 package org.wit.ff.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStre ...

  9. OpenWrt 路由器过滤广告的N种方法

    路由器已经成为每个家庭不可缺少的角色,手机.电脑.电视,凡是需要互联网的设备都要用到它.那么路由器除了给我们的网络设备分发网络外,还有其他用途吗? 现在很多人家里都用着智能路由器,智能路由器究竟怎么智 ...

  10. 自建Saltstack的repo软件源仓库

    因为Saltstack自己的repo源是在国外,在国内服务器yum安装Saltstack的时候下载软件包就非常慢,很多情况下还经常下载失败,其实软件包总大小只有10M左右,如果这样安装多台minion ...