DEBUG_声明结构体数组报错

What is the problem you are facing?

在声明结构体数组时遇见编译报错,报错信息如下:

…\User\BSP\port_config.c(13): error: #70: incomplete type is not allowed

大致代码如下:

typedef struct
{
...
} gpio_settings_config_t;

struct gpio_settings_config_t port_config_t[];

What type of device are you experiencing this problem with?

这是因为没有搞清楚typedef的用法导致的

实际上,当用了typedef为结构体创建了一个别名后,声明结构体时不需要使用struct关键词。代码改为下面代码后编译通过:

typedef struct
{
...
} gpio_settings_config_t;

gpio_settings_config_t port_config_t[];

详细的解释如下:

当使用 typedef struct {...} Employee; 定义了结构体 Employee 并且通过 typedef 为它创建了一个别名后,结构体的类型名称就成为了 Employee。这时,就不应该在声明数组时使用 struct Employee 的形式,因为 Employee 已经是一个类型名称,而不仅仅是一个结构体标签。

如果尝试使用如下声明:

struct Employee a[];

编译器会报错,因为 struct Employee 在代码中没有定义。应该使用别名 Employee 来声明数组:

Employee a[10];  // 正确的方式,声明一个有10个Employee元素的数组

或者如果数组的大小未知且稍后定义,可以声明一个指向 Employee 类型的指针,然后在运行时分配内存:

Employee *a;       // 声明一个指向Employee的指针
a = malloc(10 * sizeof(Employee));  // 分配内存给10个Employee大小的数组

总结一下,typedef 声明后的类型可以直接用来声明变量或数组,无需再加 struct 关键字,这也是 typedef 的一个优点,它使得类型名称更为简洁,并且更像是内置的数据类型。如果编译器提示错误,通常是声明使用方式不正确。

typedef struct{} xxx;struct xxx{}; 这两种声明方式

在C语言中,typedef struct{} xxx;struct xxx{}; 这两种声明方式用于定义结构体,但它们的目的和使用场景略有不同。下面分别解释这两种声明的含义和区别:

1. typedef struct{} xxx;

这种声明方式实际上是在定义一个匿名结构体,并通过typedef给它一个别名xxx。这样做的主要目的是为了简化类型的使用,使得在代码中可以直直接使用xxx代替struct xxx,增加代码的可读性和简洁性。

例如:

typedef struct {
    int age;
    char* name;
} Person;

// 使用Person来声明变量
Person p1;
p1.age = 20;
p1.name = "Alice";

在这个例子中,Person是一个别名,用于代表这个匿名结构体。在代码中,可以直接使用Person来声明变量,而不需要使用struct关键字。

2. struct xxx{}

这种声明方式是在定义一个具名的结构体,名称为xxx。这样定义的结构体可以在其他地方通过struct xxx来引用。

例如:

struct Person {
    int age;
    char* name;
};

// 使用struct Person来声明变量
struct Person p1;
p1.age = 20;
p1.name = "Alice";

在这个例子中,Person是结构体的名称,每次声明这个类型的变量时都需要使用struct Person的完整形式。

区别和选择

  • *使用typedef*的好处是可以避免在每次声明变量时都要写struct,代码更加简洁明了。这在你需要频繁使用这个类型时尤其有帮助。
  • *不使用typedef*则保留了类型的明确性,特别是在涉及到多种不同的结构体时,使用struct关键字可以更清晰地表示这是一个结构体类型。

总之,是否使用typedef主要取决于你的个人或团队编码风格以及具体的项目需求。有些代码风格更倾向于明确性,从而避免使用typedef;而有些则更看重代码的简洁性,倾向于使用typedef

When did this problem first occur?

20240422

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值