Итак .. Я получил немного курицы и яйца.
Я получил Controller_setup.h и Equipment_setup.h, которые используют typedefs, определенные в другом.Я мог бы написать здесь много об обосновании, почему это так, но воздержусь от этого, если кто-то действительно не хочет знать (хотя в основном это была попытка заставить код в Equipment_setup.c / h работать с различными системами контроллеров, просто имеядругой Controller_setup.h).
На предыдущем контроллере и компиляторе (контроллер использовал процессор ARM, а мы использовали компилятор IAR и IDE), мы разработали код, который я смог переслать, объявить / переопределить typedefsи это будет работать.Это дало бы нам много предупреждений, но скомпилировало бы и работало.
Теперь, когда мы фактически пытаемся портировать на другой контроллер, используя другую IDE и компилятор (контроллер использует процессор TriCore, и мы используем код:: блокирует IDE с помощью компилятора GNU GCC для TriCore V3.4.6) теперь он вызывает ошибки и не позволяет скомпилировать код.
Я очень новичок в этом, но из того, что я понял, я должен быть в состояниив любое время поместите объявление о том, что этот тип данных где-то определен, поэтому компилятору не следует беспокоиться, когда я ссылаюсь на этот тип данных в моих объявлениях функций.
Поскольку он работал на одном компиляторе (по общему признанию, с предупреждениями), я надеюсьесть способ заставить это работать сейчас.Я не думаю, что это так просто, как использование другого синтаксиса?Можно ли объявить 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;