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

时间:2019-04-07 23:25:03

标签: c typedef forward-declaration

所以。我正在做些鸡肉和鸡蛋的事情。

我得到了Controller_setup.h和Equipment_setup.h,它们使用了另一个定义的typedef。我可以在这里写很多关于为什么这样做的理由,但是除非有人真的想知道,否则请不要这样做(尽管基本上,这是尝试让Equipment_setup.c / h中的代码与不同的控制器系统一起工作,一个不同的Controller_setup.h)。

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

现在,我们实际上正在尝试使用另一个IDE和编译器移植到另一个控制器(控制器使用TriCore处理器,并且我们在TriCore V3.4.6的GNU GCC编译器中使用Code :: blocks IDE),现在正在引发错误并且不会让代码编译。

我对此很陌生,但是据我了解,我应该能够随时声明该数据类型已定义在某个地方,因此当我在函数声明中引用该数据类型时,编译器不必担心。

由于它只能在一个编译器上运行(肯定会出现警告),所以我希望有某种方法可以使其现在运行。我不认为这像使用其他语法一样简单吗?是否可以声明typedef与重新定义它?

实际上,我只是在谷歌上搜索了这个确切的问题,并且按照那条线索,我现在似乎已经明白,我想做的事情在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;

1 个答案:

答案 0 :(得分: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 ...
};