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. 【树状数组】bzoj2743 [HEOI2012]采花

    http://www.cnblogs.com/proverbs/archive/2012/10/29/2745281.html (↑)这样处理之后,每次询问时,对于每种颜色,从1到其倒数第二次出现的位 ...

  2. 【莫队算法】bzoj3781 小B的询问

    莫队经典. 开个数组维护a[i]出现的次数. #include<cstdio> #include<cmath> #include<algorithm> using ...

  3. 排查java.lang.OutOfMemoryError: GC overhead limit exceeded

    帮助客户排查java.lang.OutOfMemoryError: GC overhead limit exceeded错误记录: 具体网址: https://support.oracle.com/e ...

  4. 项目管理利器——Maven阅读目录

    阅读目录 一.Maven介绍及环境搭建 二.构建Maven版的Hello World 三.Maven常见构建命令 四.自动创建目录骨架 五.Maven中的坐标和仓库 六.在eclipse中安装Mave ...

  5. 【codeforces #282(div 1)】AB题解

    A. Treasure time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  6. [Typescript] Improve Readability with TypeScript Numeric Separators when working with Large Numbers

    When looking at large numbers in code (such as 1800000) it’s oftentimes difficult for the human eye ...

  7. IT痴汉的工作现状21-Android开发前景论

    饭间闲谈 齐天.周权和我是饭搭子.总是边吃边聊一些与技术.汽车和女人相关的话题. "前阵子Nokia裁员之事不知道完没完?这艾洛普挺能作啊."我吃着香喷喷的过桥米线说." ...

  8. centos 6.5 python2.6.6 zbar 安装

       经过数次折腾,终于搞明白了这个zbar的安装顺序.   1.先安装http://zbar.sourceforge.net/download.html 下的zbar,   2.python 安装z ...

  9. B2:观察者模式 Observer

    定义了一种一对多的依赖关系,多个观察者对象同时监听某一主题的变化,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们可以更新自己. 应用场景:某个实例的变化影响到了其他对象. UML: 示例代 ...

  10. ant Form 常用 api

    经过 Form.create 包装的组件将会自带 this.props.form 属性,this.props.form 提供的 API 如下: 注意:使用 getFieldsValue getFiel ...