• typedef int(init_fnc_t) (void)的理解


    typedef int(init_fnc_t) (void);

    这个就是一个取别名的过程。

    我们通常情况下会如下使用 typedef :
    typedef int MyInt;
    MyInt a;

    这个时候我们的MyInt 就和int是一样的意思。

    而对于函数的申明我们通常会这样申明:
    int InitFunction(void);
    此时表示申明了一个函数名为InitFunction的函数, 函数没有任何的形参,返回值类型为int型。

    而对于 typedef int(init_fnc_t) (void);
    就是对一个 int (void)类型的函数类型进行取别名init_fnc_t。 我们可以利用这个别名进行创建这个类型的函数对象。

    init_fnc_t *MyFunction;
    这里就是一个函数的指针。如果某个函数的类型和这个函数一样的,那么可以将这个函数的指针指向该函数。然后你就可以直接调用MyFunction();

    以下是例子

    #include <stdio.h>

    int GetData(void)
    {
        return 101;
    }

    int main()
    {
        typedef int (init_fnc_t)(void);
        typedef int (*init_fnc_t_p)(void);     
        init_fnc_t *MyFunction; init_fnc_t_p MyFunctionP;     
        MyFunction = GetData; MyFunctionP = GetData;     
        printf("(init_fnc_t)(void) = %d ",MyFunction());
        printf("(*init_fnc_t_p)(void) = %d ",MyFunctionP());
        return 0;
    }

    C程序中除了简单类型名(int、char等),还有许多看起来复杂的类型名(结构体类型、共用体类型、指针类型等),C允许程序设计者用一个简单的名字代替复杂的名字。
    1)命名一个新的类型名代表结构体类型

    typedef struct {
        int month;
        int day;
    }Date;

    Date today;  //定义变量

    声明了新的类型名Date,然后可以用新的类型名Date去定义变量。
    2)命名一个新的类型名代表数组类型

    typedef int Num[100];    //声明Num为整形数组类型名
    Num a;            //定义a为整形数组名,它有100个元素


    3)命名一个新的类型名代表指针类型

    typedef char* String;    //声明String为字符指针类型
    String p;        //定义p为字符指针变量


    4)命名一个新的类型名代表指向函数的指针类型

    typedef int (* Pointer)();    //声明Pointer为指向函数的指针类型,函数返回整型值
    Pointer p;            //p为Pointer类型的指针变量



    归纳起来,声明一个新的类型名的方法是:
    ①先按定义变量的方法写出定义体(如int i;)。
    ②将变量名换成新类型名(例如:将i换成Count)。
    ③在最前面加typedef(例如:typedef int Count)。
    ④然后可以用新类型名去定义变量。

    ① 先按定义数组变量形式书写: int n[100]

    ② 将变量名n换成自己指定的类型名:

       int  NUM [100];

    ③ 在前面加上 typedef ,得到

       typedef int NUM [100];

    ④ 用来定义变量: NUM  n;


    简单地说,就是 按定义变量的方式,把变量名换上新类型名,并且在最前面加“typedef”,就声明了新类型名代表原来的类型。
    习惯上,常把用typedef声明的类型名的第一个字母用大写表示,以便于系统提供的标准类型标识符相区别。

    include/initcall.h

    typedef int (*init_fnc_t)(void);

    common/board_f.c

    static const init_fnc_t init_sequence_f[] = {

    common/board_r.c

    static init_fnc_t init_sequence_r[] = {

  • 相关阅读:
    Entity Framework Code First 数据迁移
    Tekla Structures 使用类库概览
    从IT的角度思考BIM(三):敏捷开发
    在 IIS MIME 类型中添加 md 扩展名
    使用 windows 计划任务播放音乐文件
    Win10 IIS以及ASP.NET 4.0配置问题日志
    从IT的角度思考BIM(二):模式与框架
    最小生成树算法总结(Kruskal,Prim)
    最短路径算法总结(floyd,dijkstra,bellman-ford)
    大整数运算模板总结
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/11625134.html
Copyright © 2020-2023  润新知