【问题标题】:Use typedef struct in another file in C在 C 中的另一个文件中使用 typedef 结构
【发布时间】:2021-04-28 19:25:17
【问题描述】:

你好,我是 C 新手。

我想“导出”并在其他文件中使用 typedef 结构,但它似乎不起作用。

我有这些错误

unknown type name 'CAN_frame'
storage size of 'CAN_RxMessage' isn't known
invalid use of undefined type 'struct CAN_frame'

这是我的文件:

ma​​in.h

#include "can.h"
typedef struct
{
    uint16_t STDID;  //ID
    uint8_t IDE;
    uint8_t RTR;     //Request frame ou data frame
    uint8_t DLC;     //Nombre d'octets de données utiles
    uint8_t data[8]; //Tableau de 8 octets de données
}CAN_frame;

can.h

#include "main.h"

can.c

#include "can.h"
CAN_frame CAN_RxMessage;

void reception_CAN(void)
{
    //CAN_RxMessage filled with data
}

当然,我也想使用这个在我的 main.c 中填充数据的 CAN_RxMessage(将它与 usart 一起发送到我的计算机)。

我尝试在我的 can.c 和 can.h 中使用 extern、extern struct、struct 和手动定义的 CAN_frame(但我认为它只会在我的 main.c 中重载或重新定义 CAN_frame,所以它似乎没用)。

【问题讨论】:

  • 所以main.h 包括can.hcan.h 包括main.h。回想一下,包含基本上将文件内容转储到位(作为文本)。循环包含应该如何工作?
  • 在我看来,can.h 包括 main.hmain.h 包括 can.h。预处理器可能会产生关于包含文件无限循环的错误。
  • 了解如何使用标头保护来防止多个包含和包含循环。
  • 即使有标头保护,在标头之间存在循环依赖通常也是有问题的。在出现此类依赖关系的地方,它们可以而且应该通过适当的重构来解决。

标签: c struct c-header


【解决方案1】:

就是这样。

can.h

typedef struct _CAN_frame
{
    uint16_t STDID;  //ID
    uint8_t IDE;
    uint8_t RTR;     //Request frame ou data frame
    uint8_t DLC;     //Nombre d'octets de données utiles
    uint8_t data[8]; //Tableau de 8 octets de données
}CAN_frame;

can.c

#include "can.h"

ma​​in.c

#include "can.h"
CAN_frame CAN_RxMessage;

void reception_CAN(void)
{
    //CAN_RxMessage filled with data
}

【讨论】:

  • 谢谢,它帮助了我!我还使用 extern 在文件之间共享全局变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2015-06-03
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多