http://blog.csdn.net/unix21/article/details/9470139 2013 最近在看redis源码的时候看到Ae.h的时候看到如下源码:
对于函数,typedef有两类自定义类型,恰好在Nginx和Redis中分别使用了一种风格。参见:函数指针--Nginx和Redis中两种回调函数写法
----以上选自《C语言编程:一本全面的C语言入门教程 (第3版)》
更深度的分析:
--以上出自《C语言入门经典(第四版)》
下面是一些常用的总结: 1、定义数组类型 typedef int myIntArray[100]; 或 typedef int myIntArray [100]; 则myIntArray a; 等价于 int a[100];
2、定义函数类型 typedef bool do(); 则do就成为一种函数类型,它可以用来定义指向bool类型函数的指针,如下: bool realDo(); do * doP = realDo; 或 do* doP = &realDo; (这两个语句是一样的,函数名本身就是一个指针,他们性质完全相同,只是哪个更容易理解一些而已) 还不明白的话,可以试运行以下的代码: #include <iostream.h> bool aaa() void main()
3、定义函数指针 typedef void (*funcPtr)(int); 上面的语句的意义是:定义了一个函数指针,它可以指向的函数类型是无反回值并且有一个int参数,如下: #include <iostream.h> void print(int a) void main() 来个复杂的: funcPtr aa(funcPtr bb); 如果不用typedef定义的函数类型,则要写成如下形式: void (*aa(void (*bb) (int))(int); 就会很难懂。
4、定义指针 typedef int * intP; 也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一。
typedef的一般形式为: typedef 类型 定义名;
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 其实,在C语言中声明变量的时候,有个存储类型指示符(storage-class-specifier),它包括我们熟悉的extern、static、auto、register。在不指定存储类型指示符的时候,编译器会根据约定自动取缺省值。另外,存储类型指示符的位置也是任意的(但要求在变量名和指针*之前),也就是说以下几行代码是等价的: static const int i; const static int i; int const static i; const int static i; 根据C语言规范,在进行句法分析的时候,typedef和存储类型指示符是等价的!所以,我们把上述使用static的地方替换为typedef: typedef const int i; const typedef int i; int const typedef i; const int typedef i; 上述代码的语义是:将i定义为一个类型名,其等价的类型为const int。以后如果我们有i a代码,就等价于const int a。对于有指针的地方也是一样的,比如: int const typedef *t;那么代码t p。就相当于int const *p。 另外,typedef不能和static等存储类型指示符同时使用,因为每个变量只能有一种存储类型,所以代码:typedef static int i;是非法的。
使用typedef简化复杂的变量声明 1)、定义一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数,并返回一个整型? 第一种方法:int (*a[10])(int); 第二种方法:typedef int (*pfunc)(int); pfunc a[10]; 2)、定义一个有10个指针的数组,该指针指向一个函数,该函数有一个函数指针(不带参数,返回值为空)参数,并返回空。 第一种方法:void (*a[10])(void (*)(void)); 第二种方法:typedef void (*pfuncParam)(void); typedef void (*pfunc)(pfuncParam); pfunc a[10]; 3)、一个指向有10个函数指针(不带参数,返回值为double)数组的指针 第一种方法:double (*)(void) (*p)[10]; 第二种方法:typedef double (*pfunc)(void); typedef pfunc (*pfuncParam)[10]; pfuncParam p;
总结: typedef有两种用法: 一、一般形式,定义已有类型的别名 typedef 类型 定义名; 二、创建一个新的类型 typedef 返回值类型 新类型名(参数列表);
|
|