Почему этот тип не может быть разрешен? - PullRequest
1 голос
/ 02 марта 2020

В моем заголовочном файле C есть следующий код:

typedef struct mb32_packet_t {
  uint8_t compid;
  uint8_t servid;
  uint8_t payload[248];
  uint8_t checksum;
} __attribute__((packed)) mb32_packet_s;

Выполнение следующих работ:

struct mb32_packet_t packet;

При использовании этого:

mb32_packet_t packet;

Я получаю:

Type 'mb32_packet_t' could not be resolved
Unknown type name 'mb32_packet_t'; use 'struct' keyword to refer to the type

Разве typedef struct не предназначен именно для этой цели, то есть для возможности опустить ключевое слово struct при определении переменных этого типа?

Ответы [ 3 ]

1 голос
/ 02 марта 2020

Объявление typedef struct mb32_packet_t ... mb32_packet_s; делает mb32_packet_t тегом, который работает только после ключевого слова struct, и делает mb32_packet_s именем типа, которое работает само по себе. Чтобы сделать mb32_packet_t именем типа, поменяйте их местами в объявлении или используйте mb32_packet_t в обоих местах.

1 голос
/ 02 марта 2020

В вашем typedef struct... коде mb32_packet_t является структурным тегом , а не именем определенного типа, которым является mb32_packet_s. Вы можете использовать тег в объявлении переменной, но только , если вы также включите ключевое слово struct.

Чтобы объявить переменную типа без the struct ключевое слово, вам нужно использовать фактическое имя типа, как показано ниже:

mb32_packet_s packet; // Note the "_s" rather than "_t" and the end.
1 голос
/ 02 марта 2020

Ваш псевдоним, определенный typedef, называется mb32_packet_s. Таким образом, вам нужно использовать его как

mb32_packet_s packet;

или

struct mb32_packet_t packet;

Вы также можете переименовать псевдоним в mb32_packet_t:

typedef struct mb32_packet_t {
  uint8_t compid;
  uint8_t servid;
  uint8_t payload[248];
  uint8_t checksum;
} __attribute__((packed)) mb32_packet_t;

Затем вы можете сделать оба (оригинальное имя без псевдонима)

struct mb32_packet_t packet;

и (с псевдонимом)

mb32_packet_t packet;

Таким образом, имена псевдонима и структуры идентичны, но технически, struct mb32_packet_t и mb32_packet_t это две разные вещи, которые, однако, относятся к одному и тому же типу.

...