C:转发声明一个typedef,稍后定义它将用于现在声明一个函数

问题描述 投票:1回答:1

所以......我吃了一点鸡蛋和鸡蛋。

我得到了Controller_setup.h和Equipment_setup.h,它们使用另一个中定义的typedef。我可以在这里写一些关于证明这是为什么的理由,但是除非有人真的想知道(尽管基本上是试图让设备中的代码与不同的控制器系统一起工作,只是通过一个不同的Controller_setup.h)。

在之前的控制器和编译器(控制器使用ARM处理器,我们使用的是IAR编译器和IDE)上,我们开发了代码,我能够转发声明/重新定义typedef,它可以工作。它会给我们很多警告,但它会编译和工作。

现在我们正在尝试使用另一个IDE和编译器(控制器使用TriCore处理器,我们使用Code :: blocks IDE和GNU GCC编译器用于TriCore V3.4.6)移植到另一个控制器,它现在正在引发错误并赢得了'让代码编译。

我对此非常陌生,但是根据我的理解,我应该能够随时声明这个数据类型是在某处定义的,因此当我在函数声明中引用该数据类型时,编译器不应该担心。

由于它在一个编译器上工作(诚然有警告),我希望有一些方法可以使它现在工作。我不认为它就像使用不同的语法一样简单吗?是否可以声明typedef vs重新定义它?

实际上我只是搜索了那个确切的问题并且通过跟踪这条线索我现在似乎明白我想要做的事情是在C11下允许的,但不是之前的C标准。据我所知,Tricore编译器不支持C11,所以这可能是它曾经工作但不是现在的原因。

但如果有人可以帮助验证这种理解,那将是值得赞赏的。

我真的不想找到一个解决方法,因为我担心这可能意味着对程序的结构进行相当大的修改。从长远来看,这可能会更好,但现在不是必须这样做的好时机。

下面是已经工作但现在没有的简化版本。我遗漏了Controller_setup.h引用Equipment_setup.h的部分。当项目构建时,首先读取Equipment_setup.h,然后在读取Controller_setup.h中的重新定义时得到错误。

错误消息是:

  • 错误:[12993]重新定义typedef'IO_link_t'
  • 错误:[13256]之前的'IO_link_t'声明就在这里

Equipment_setup.h

//The functions declared here are used by other .c files which
//determine how the equipment is to operate

typedef enum IO_devices_t IO_devices_t;
typedef struct IO_link_t IO_link_t;

//Declare function for checking status of a given IO device
uint8_t check_IO_device_status(IO_device_t device);

//Declare function for calibrating an input
uint8_t calibrate_input(IO_link_t*  input);

Controller_setup.h

typedef enum IO_devices_t{
  MAIN_CONTROLLER,
  REMOTE_IO_1,
  REMOTE_IO_2,
  //... will vary based on controllers being used...
  HMI_1,
  NUMBER_IO_DEVICES
} IO_devices_t;

typedef struct IO_link_t {
  IO_msg_ptr_t          IO_msg_ptr;
  uint8_t               IO_msg_size;
  IO_logic_ptr_t        IO_logic_ptr;
  //... other members as required by Equipment_setup.h ...
  //... members that vary based on the controller's SDK ...
} IO_link_t;
c typedef forward-declaration
1个回答
2
投票

当你这样做:

typedef struct IO_link_t IO_link_t;

typedef定义了一种类型。你也宣布struct IO_link_t。当你这样做时:

typedef struct IO_link_t {
  IO_msg_ptr_t          IO_msg_ptr;
  uint8_t               IO_msg_size;
  IO_logic_ptr_t        IO_logic_ptr;
  //... other members as required by Equipment_setup.h ...
  //... members that vary based on the controller's SDK ...
} IO_link_t;

您定义之前未定义的struct IO_link_t,但您也重新定义了IO_link_t类型。这就是错误的来源。 enum也是如此。

你可以通过删除typedefstruct定义点的enum来解决这个问题。

enum IO_devices_t{
  MAIN_CONTROLLER,
  REMOTE_IO_1,
  REMOTE_IO_2,
  //... will vary based on controllers being used...
  HMI_1,
  NUMBER_IO_DEVICES
};

struct IO_link_t {
  IO_msg_ptr_t          IO_msg_ptr;
  uint8_t               IO_msg_size;
  IO_logic_ptr_t        IO_logic_ptr;
  //... other members as required by Equipment_setup.h ...
  //... members that vary based on the controller's SDK ...
};
© www.soinside.com 2019 - 2024. All rights reserved.