会飞的猪_2020 发表于 2023-12-22 10:33:37

typdef struct 和 struct 再typdef

我一直都很疑惑,这两种方法到底有什么区别?
有的人喜欢
typedef struct {
    int x;
    int y;
} point_t;

有的人喜欢
typedef struct point point_t;
struct point {
    int x;
    int y;
};

后来归结于编码习惯,然后我就一直用的typedef struct这种方式。

一直到今天,想写一个结构体包含它自己,结果发现用第一种包含不了,会报错。
typedef struct
{
...
void (*function)(point_t *dev);
...
} point_t;

但是用第二种方式,前向声明就可以不报错。

typedef struct point point_t; // 前向声明

struct point
{

...
void (*function)(point_t *dev);
...
};


会飞的猪_2020 发表于 2023-12-22 10:49:33

我个人的想法是这样的,但是不知道理解是不是哪里有误。可能用typedef也能实现同样的功能,只是我没想到。

eric2013 发表于 2023-12-22 10:52:35

第1种是开头写的那种吗,HAL库是这么包含函数的,typedef struct __DMA_HandleTypeDef,成员里面使用__DMA_HandleTypeDef

typedef struct __DMA_HandleTypeDef
{
void                            *Instance;                                                      /*!< Register base address                         */

DMA_InitTypeDef               Init;                                                             /*!< DMA communication parameters                  */

HAL_LockTypeDef               Lock;                                                             /*!< DMA locking object                            */

__IO HAL_DMA_StateTypeDef       State;                                                            /*!< DMA transfer state                            */

void                            *Parent;                                                          /*!< Parent object state                           */

void                            (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma);         /*!< DMA transfer complete callback                */

void                            (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);   /*!< DMA Half transfer complete callback         */

void                            (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma);       /*!< DMA transfer complete Memory1 callback      */

void                            (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);   /*!< DMA transfer Half complete Memory1 callback   */

void                            (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);      /*!< DMA transfer error callback                   */

void                            (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma);      /*!< DMA transfer Abort callback                   */

__IO uint32_t                  ErrorCode;                                                      /*!< DMA Error code                              */

uint32_t                         StreamBaseAddress;                                                /*!< DMA Stream Base Address                     */

uint32_t                         StreamIndex;                                                      /*!< DMA Stream Index                              */

DMAMUX_Channel_TypeDef         *DMAmuxChannel;                                                   /*!< DMAMUX Channel Base Address                   */

DMAMUX_ChannelStatus_TypeDef   *DMAmuxChannelStatus;                                             /*!< DMAMUX Channels Status Base Address         */

uint32_t                         DMAmuxChannelStatusMask;                                          /*!< DMAMUX Channel Status Mask                  */


DMAMUX_RequestGen_TypeDef      *DMAmuxRequestGen;                                                /*!< DMAMUX request generator Base Address         */

DMAMUX_RequestGenStatus_TypeDef*DMAmuxRequestGenStatus;                                          /*!< DMAMUX request generator Status Address       */

uint32_t                         DMAmuxRequestGenStatusMask;                                       /*!< DMAMUX request generator Status mask          */

}DMA_HandleTypeDef;

会飞的猪_2020 发表于 2023-12-22 10:54:38

eric2013 发表于 2023-12-22 10:52
第1种是开头写的那种吗,HAL库是这么包含函数的,typedef struct __DMA_HandleTypeDef,成员里面使用__DMA_ ...

是的,那这样子看这两种写法就是编码风格不同。功能都是能实现的。

yunqi 发表于 2024-1-23 13:49:54

typedef struct point point_t;
struct point {
    int x;
    int y;
};
typedef struct point point_t;。 这是告诉编译器,我声明了一个结构体的名字【point_t】。后面在碰到使用结构体名字【point_t】(包含自己套用自己,但不能用成员,因为成员还没定义),都是指向同一个数据类型【struct point 】。至于该结构体【struct point 】的定义,你用之前定义了就行,否则编译器不知道数据类型的详细信息。
页: [1]
查看完整版本: typdef struct 和 struct 再typdef