typedef用法详解

    xiaoxiao2021-03-25  114

    也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一。 若说变量定义是为变量命名,而typedef(或称为类型定义)就是为类型命名。既然都是命名,那就会有很多类似的地方。而变量定义我想大家都会使用,因此类型定义也必然会使用。 类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义。这儿的原本应该是变量的东西,就成为了类型。 如,下面的变量定义: int integer;     //整型变量 int *pointer;   //整型指针变量 int array [5]; //整型数组变量 int *p_array [5]; //整型指针的数组的变量 int (*array_pointer) [5];//整型数组的指针的变量 int function (int param);//函数定义,也可将函数名看作函数的变量 int *function (int param);//仍然是函数,但返回值是整型指针 int (*function) (int param);//现在就是指向函数的指针了 若要定义相应类型,即为类型来起名字,就是下面的形式: typedef int integer_t;                      //整型类型 typedef int *pointer_t;     //整型指针类型 typedef int array_t [5]; //整型数组类型 typedef int *p_array_t [5];    //整型指针的数组的类型 typedef int (*array_pointer_t) [5]; //整型数组的指针的类型 typedef int function_t (int param);     //函数类型 typedef int *function_t (int param);    //函数类型 typedef int (*function_t) (int param); //指向函数的指针的类型 注意,上面的函数类型在C中可能会出错,因为C中并没有函数类型,它的函数变量会自动退化成函数指针;在C++中好像是可以的。在这里主要说明的是形式上的相似性.

     

     

    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   返回值类型   新类型名(参数列表); 补充:

    函数指针通常用来实现回调,也可以用来对模块调用以函数表的形式进行优化。

    使用方法:

     1、定义函数指针类型

    使用typedef更直观更方便

    // 定义一个原型为int Fun( int a );的函数指针

    typedef int (*PTRFUN) ( int aPara );

    typedef的功能是定义新的类型。

    这里定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回int类型。后面就可以像使用int,int一样使用PTRFUN了。

     2、函数指针变量的定义

    PTRFUN pFun; //pFun 为函数指针变量名

    int (*pFun2) ( int a ); // pFun2也是函数指针变量名

    3、函数指针作为函数的参数传递

    // 定义回调函数

    int CallBack( int a )

    {

    return ++a;

    }

     

    // 定义回调者函数

    void Caller( PTRFUN cb )

    // void Caller( int (*cb) ( int ) ) // 也可这样申明

    {

    int nPara = 1;

    int nRet = cb( nPara );

    }

     

    // 使用回调

    void Test()

    {

    Caller( CallBack ); // 直接使用回调函数

    PTRFUN cb = CallBack; // int (*cb) ( int ); cb = CallBack;

    int nRet1 = cb( 99 ); // nRet1 = 100;

    }

    转载请注明原文地址: https://ju.6miu.com/read-7068.html

    最新回复(0)