硬汉嵌入式论坛

 找回密码
 立即注册
查看: 606|回复: 4
收起左侧

typdef struct 和 struct 再typdef

[复制链接]

38

主题

194

回帖

318

积分

高级会员

积分
318
发表于 2023-12-22 10:33:37 | 显示全部楼层 |阅读模式
我一直都很疑惑,这两种方法到底有什么区别?
有的人喜欢
[C] 纯文本查看 复制代码
typedef struct {
    int x;
    int y;
} point_t;


有的人喜欢
[C] 纯文本查看 复制代码
typedef struct point point_t;
struct point {
    int x;
    int y;
};


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

一直到今天,想写一个结构体包含它自己,结果发现用第一种包含不了,会报错。
[C] 纯文本查看 复制代码
typedef struct
{
...
void (*function)(point_t *dev); 
...
} point_t;


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

[C] 纯文本查看 复制代码
typedef struct point point_t; // 前向声明

struct point 
{

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



回复

使用道具 举报

38

主题

194

回帖

318

积分

高级会员

积分
318
 楼主| 发表于 2023-12-22 10:49:33 | 显示全部楼层
我个人的想法是这样的,但是不知道理解是不是哪里有误。可能用typedef也能实现同样的功能,只是我没想到。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-12-22 10:52:35 | 显示全部楼层
第1种是开头写的那种吗,HAL库是这么包含函数的,typedef struct __DMA_HandleTypeDef,成员里面使用__DMA_HandleTypeDef

[C] 纯文本查看 复制代码
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;
回复

使用道具 举报

38

主题

194

回帖

318

积分

高级会员

积分
318
 楼主| 发表于 2023-12-22 10:54:38 | 显示全部楼层
eric2013 发表于 2023-12-22 10:52
第1种是开头写的那种吗,HAL库是这么包含函数的,typedef struct __DMA_HandleTypeDef,成员里面使用__DMA_ ...

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

使用道具 举报

8

主题

157

回帖

181

积分

初级会员

积分
181
发表于 2024-1-23 13:49:54 | 显示全部楼层
[C] 纯文本查看 复制代码
typedef struct point point_t;
struct point {
    int x;
    int y;
};

typedef struct point point_t;。 这是告诉编译器,我声明了一个结构体的名字【point_t】。后面在碰到使用结构体名字【point_t】(包含自己套用自己,但不能用成员,因为成员还没定义),都是指向同一个数据类型【struct point 】。至于该结构体【struct point 】的定义,你用之前定义了就行,否则编译器不知道数据类型的详细信息。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 08:46 , Processed in 0.186575 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表