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);
...
};
我个人的想法是这样的,但是不知道理解是不是哪里有误。可能用typedef也能实现同样的功能,只是我没想到。 第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; eric2013 发表于 2023-12-22 10:52
第1种是开头写的那种吗,HAL库是这么包含函数的,typedef struct __DMA_HandleTypeDef,成员里面使用__DMA_ ...
是的,那这样子看这两种写法就是编码风格不同。功能都是能实现的。 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]