所以。我正在做些鸡肉和鸡蛋的事情。
我得到了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;
答案 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
也是如此。
您可以通过在定义typedef
和struct
的位置删除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 ...
};