zoukankan      html  css  js  c++  java
  • NRF51822+STM32bootload——typedef void (*Fun) (void) 理解

    1、typdef 用法如下所示

    1 typedef unsigned char    uint8_t;
    2 typedef unsigned short int  uint16_t;
    3 typedef unsigned int    uint32_t;  
    4 uint8_t i;  //定义一个8位无符号字符型变量

     2、指针函数形式

     1 //定义一个函数指针pfun,指向一个返回类型为int,有一个参数为int的函数
     2 int (*pfun)(int) ; 
     3 //指针层面理解,函数的函数 名是一个指针
     4 //指针指向函数在内存中的首地址
     5 int shiftfun(int a)
     6 {
     7    int temp;
     8    temp = a;
     9    temp<<a;
    10    return a;
    11 }
    12 int main()
    13 {
    14     int temp;
    15 //将函数shiftfun的地址赋值给变量pfun
    16     pfun = shiftfun;  
    17 //*pfun ”显然是取pfun 所指向地址的内容,当然也就是取出了函数shiftfun()的内容,然后给定参数为2。  
    18      temp = (*pfun)(2);  
    19 } 

     3、typedef  返回类型(*新类型)(参数表)

    1 typedef char (*PTRFUN)(int);   
    2 PTRFUN pFun;   
    3 char glFun(int a){ return;}   
    4 void main()   
    5 {   
    6     pFun = glFun;   
    7     (*pFun)(2);   
    8 } 

     由上对typedef void (*Fun) (void);理解

    typedef 的作用是把已知的类型定义新类型,所以新类型(*Func)(void)的返回值是void。

    定义了一个新类型,该类型是一个函数指针,它指向的函数形参为void,返回值为void。

     


     

    发现51822中有个SPI从机事件回调函数类型

    1 /** @brief SPI slave event callback function type.
    2  *
    3  * @param[in] event                 SPI slave driver event.  
    4  */
    5 typedef void (*nrf_drv_spis_event_handler_t)(nrf_drv_spis_event_t event);

    上文代码定义了一个新类型,该类型为*nrf_drv_spis_event_handler_t 的函数指针,它指向的函数形参event为nrf_drv_spis_event_t类型的结构体结构体格式如下所示,返回值为void。

    1 /** @brief Structure containing the event context from the SPI slave driver. */
    2 typedef struct
    3 {
    4     nrf_drv_spis_event_type_t evt_type;     //!< Type of event.
    5     uint32_t                  rx_amount;    //!< Number of bytes received in last transaction. This parameter is only valid for @ref NRF_DRV_SPIS_XFER_DONE events.
    6     uint32_t                  tx_amount;    //!< Number of bytes transmitted in last transaction. This parameter is only valid for @ref NRF_DRV_SPIS_XFER_DONE events.
    7 } nrf_drv_spis_event_t;

     回调示例如下所示:

    1 ret_code_t nrf_drv_spis_init(nrf_drv_spis_t const * const  p_instance,
    2                              nrf_drv_spis_config_t const * p_config,
    3                              nrf_drv_spis_event_handler_t  event_handler) //此处该指针函数作为形参
    4 {
    5    ......
    6 }

    定义了一个函数nrf_drv_spis_init,该函数有一个参数event_handler类型为上面定义的新类型nrf_drv_spis_event_handler_t

     1 APP_ERROR_CHECK(nrf_drv_spis_init(&spis, &spis_config, spis_event_handler)); //调用以上函数传参spis_event_handler 

     此处调用这个nrf_drv_spis_init函数,传入参数为spis_event_handler

    1 void spis_event_handler(nrf_drv_spis_event_t event)
    2 {
    3     ......
    4 }

     追踪到参数spis_event_handler,发现它指向的函数形参event 为nrf_drv_spis_event_t类型的结构体,返回值为void。与上面定义函数指针类型相同。

    以上便是定义一个新类型的函数指针nrf_drv_spis_event_handler_t 指向的函数spis_event_handler该函数格式为(函数形参event 为nrf_drv_spis_event_t类型的结构体,返回值为void),作为一个参数event_handler,被另一个函数nrf_drv_spis_init调用的全过程!

  • 相关阅读:
    hibernate4.3.5,Final hibernate.cfg.xml的配置
    mysql 入门 jdbc
    设计模式之责任链
    淘宝技术这十年
    java代码---------计算器实现
    java代码---------打印正三角形
    java代码=====实现修改while()
    java------------break;
    java代码-----循环变量的
    java代码----------实现写出循环
  • 原文地址:https://www.cnblogs.com/smy87/p/9205478.html
Copyright © 2011-2022 走看看