C: Переслать объявление typedef, которое будет определено позже для использования при объявлении функции сейчас - PullRequest
1 голос
/ 08 апреля 2019

Итак .. Я получил немного курицы и яйца.

Я получил 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;

1 Ответ

2 голосов
/ 08 апреля 2019

Когда вы делаете это:

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 ...
};
...