为什么这个类型不能解析?

Why can this type not be resolved?

我的 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 关键字吗?

您在 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_tmb32_packet_t 是两个不同的东西,但是指的是同一类型。

声明 typedef struct mb32_packet_t ... mb32_packet_s; 使 mb32_packet_t 成为仅在关键字 struct 之后起作用的标记,并使 mb32_packet_s 成为独立起作用的类型名称。要使 mb32_packet_t 成为类型名称,请在声明中交换它们或在两个地方使用 mb32_packet_t

在您的 typedef struct... 代码中,mb32_packet_t 是一个 ,而不是定义类型的名称,即 mb32_packet_s。您可以在变量声明中使用标记,但 如果您还包含 struct 关键字。

要声明一个类型的变量而没有struct关键字,你需要使用类型的实际名称,如下:

mb32_packet_s packet; // Note the "_s" rather than "_t" and the end.