7.3.2 typedef

    为了避免读者对typedef的用法产生误解,前面一直没有介绍typedef的相关内容,介绍完函数指针,现在介绍typedef的相关内容。

    typedef用来给一个已经存在的类型声明一个别名,举一个最简单的例子。


    typedef intint_p;//不要忘记分号typedef为int引入了一个新的助记符int_p,可以在程序中使用int_p声明指向int型变量的指针,如下所示。 int_p pA,pB;

    上述代码声明了两个int型指针变量pA和pB,应当注意typedef不同于编译预处理命令#define,这种不同主要体现在以下两个方面。

    (1)#define是预处理指令,在编译预处理时进行简单的替换,不做正确性检查,不管含义,只是简单的替换,如下所示。


    #define PI 3.14

    程序中,所有出现PI的地方都被替换为3.14,如果错把3.14写为3.i4,编译预处理并不会指出任何错误,所有出现PI的地方都会被替换成3.i4,但是编译器会指出错误。

    而typedef是在编译时进行处理的,可以理解为“为某个类型寻找另外一种书写方式”,请看下述代码。


    #define int_p int* int_p a,b;//相当于int*a,b;a是int型指针变量,b是int型变量,简单的宏替换对比 typedef int*int_p; int_p a,b;//a,b都为指向int型指针变量,typedef为int*引入了一个新的助记符结合指针的相关内容可以解释下述代码。 typedef int*int_ptypedef; #define int_pdefine int* 那么 const int_ptypedef p1;//p1不可更改,但其指向的变量可更改 const int_pdefine p2;//p2可更改,但其指向的内容不可更改

    int_ptypedef是一种指针类型,“const int_ptypedef p1;”声明了const指针p1,相当于“intconst p1”,p1的值不可修改,但其指向的变量可以修改,“const int_pdefine p2;”等价于“const intp2”,指针p2可以修改,但无法通过p2的间接引用修改其指向的变量。

    注意

    typedef语句后的分号不要忘记,#define不是语句,后面不能加分号,如果#define结构后出现分号,会一起被替换。

    注意

    typedef结构不能出现在函数中,因此,typedef结构具有文件作用域(编译单元作用域)。

    (2)#define结构可以抽象为如下所示。


    #define A B程序中,所有出现A的地方都被B替换,A和B是分开的两个部分,而typedef后面是一条声明语句(一个整体),如下所示。 typedef int*int_p;

    把typedef去掉后的部分“intint_p;”是条完整的声明语句,声明了int型指针变量int_p,使用typedef后,int_p相当于int的别名,或者是“助记符”。这样,便可以将一个复杂的声明用一个简单的助记符代替,对代码7.8进行改写,如代码7.9所示。

    代码7.9 使用typedef简化函数指针声明UseTypedef


    <————————————文件名:example709.cpp———————————————> 01 #include<iostream> 02 #include<cstring>//strcmp用到的头文件 03 typedef int(Func)(const char,const char*);//typedef后,Func可以当成一种类型来用 04 using namespace std; 05 int main() 06 { 07 char sz1[]="hello,C++"; 08 char sz2[]="hello"; 09 Func pF;//创建函数指针pF 10 pF=strcmp;//也可写作pF=&strcmp; 11 int result=pF(sz1,sz2);//也可写作int result=(*pF)(sz1,sz2); 12 if(result==0) 13 cout<<"字符串相等"<<endl; 14 else 15 cout<<"字符串不等"<<endl; 16 return 0; 17 }

    输出结果如下所示。


    字符串不等

    【代码解析】代码第3行,“typedef int(Func)(const char,const char);”的返回值为int型,有两个char参数的函数指针声明了一个助记符(别名)Func,因此,在程序中便可以使用“Func pF;”像声明普通的int、double类型一样声明一个Func型的函数指针。

    注意

    typedef后面是条完整的声明语句,普通的变量名Func因为typedef的存在成了类型的别名。