C 为什么不能解决这类问题?

C 为什么不能解决这类问题?,c,struct,typedef,esp32,C,Struct,Typedef,Esp32,我的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 'mb3

我的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\u packet
。所以你需要把它当作

mb32_分组&u分组;

struct mb32_packet_t packet;
您还可以将别名重命名为
mb32\u packet\t

typedef结构mb32_数据包{
uint8_t compid;
uint8_t服务;
uint8_t有效载荷[248];
uint8_t校验和;
}_uuu属性uuuu((打包))mb32_数据包t;
然后您可以同时执行这两项操作(原始名称,不带别名)

struct mb32_packet_t packet;
及(化名)

mb32_-packet_-t-packet;

这样一来,别名和结构的名称都是相同的,但从技术上讲,
struct mb32_packet_t
mb32_packet_t
是指同一类型的两个不同的东西。

typedef
定义的别名称为
mb32_packet
。所以你需要把它当作

mb32_分组&u分组;

struct mb32_packet_t packet;
您还可以将别名重命名为
mb32\u packet\t

typedef结构mb32_数据包{
uint8_t compid;
uint8_t服务;
uint8_t有效载荷[248];
uint8_t校验和;
}_uuu属性uuuu((打包))mb32_数据包t;
然后您可以同时执行这两项操作(原始名称,不带别名)

struct mb32_packet_t packet;
及(化名)

mb32_-packet_-t-packet;

这样,别名和结构的名称都是相同的,但从技术上讲,
struct mb32_packet_t
mb32_packet_t
是指同一类型的两个不同事物。

声明
typedef struct mb32_packet\t。。。mb32_数据包
使
mb32_packet_t
成为一个仅在关键字
struct
之后工作的标记,并使
mb32_packet_s
成为一个独立工作的类型名称。要使
mb32_packet\u t
成为类型名称,请在声明中交换它们,或在两个位置使用
mb32_packet\u t
。声明
typedef struct mb32_packet\t。。。mb32_数据包
使
mb32_packet_t
成为一个仅在关键字
struct
之后工作的标记,并使
mb32_packet_s
成为一个独立工作的类型名称。要使
mb32_-packet\u t
成为一个类型名称,请在声明中交换它们,或在两个位置使用
mb32_-packet\u t

typedef结构中…
代码中,
mb32_-packet\u
是一个,而不是定义类型的名称,即
mb32_-packet\u-s
。您可以在变量声明中使用该标记,但前提是还包括
struct
关键字

要声明不带
struct
关键字的类型变量,需要使用类型的实际名称,如下所示:

mb32\u数据包\u s数据包;//注意“\u s”而不是“\u t”和结尾。

在您的
typedef结构中…
code中,
mb32\u数据包是a,而不是定义类型的名称,即
mb32\u数据包
。您可以在变量声明中使用该标记,但前提是还包括
struct
关键字

要声明不带
struct
关键字的类型变量,需要使用类型的实际名称,如下所示:

mb32\u数据包\u s数据包;//注意“\u s”而不是“\u t”和结尾。

谢谢解释,我将按照您的描述使用它!但是为了理解我最初的
struct
定义:
mb32_packet_s
实际上是一个对象,即分配的内存,对吗?当以后写入
mb32_包时这不会分配新内存;i、 e.
packet
只是对
mb32_packet
的一种引用。不,只有
packet
是一个对象,即保留内存
mb32_packet_s
只是
struct mb32_packet_t
的别名,即两者都是类型。现在我想我明白了。如果我在结构的末尾定义/初始化
mb32_packet_s={…}
,那么
mb32_packet_s
确实是驻留在内存中的对象吗?你不能和
typedef
一起这样做。您可以执行
struct X{…}实例={…}将创建结构类型的实例(对象),但不会定义别名。如果同时需要实例和别名,则需要
typedef struct X{…}X;X实例={…}
结构X{…};typedef结构X;X实例={…}
结构X{…}实例={…};typedef结构X现在我明白了:)!谢谢你的耐心!谢谢解释,我会按照你的描述使用它!但是为了理解我最初的
struct
定义:
mb32_packet_s
实际上是一个对象,即分配的内存,对吗?当以后写入
mb32_包时这不会分配新内存;i、 e.
packet
只是对
mb32_packet
的一种引用。不,只有
packet
是一个对象,即保留内存
mb32_packet_s
只是
struct mb32_packet_t
的别名,即两者都是类型。现在我想我明白了。如果我在结构的末尾定义/初始化
mb32_packet_s={…}
,那么
mb32_packet_s
确实是驻留在内存中的对象吗?你不能和
typedef
一起这样做。您可以执行
struct X{…}实例={…}将创建结构类型的实例(对象),但不会定义别名。如果同时需要实例和别名,则需要
typedef struct X{…}X;X实例={…}
结构X{…};typedef结构X;X实例={…}