You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

typedef struct定义结构体编译报错:storage size of ‘struct’ isn’t known

问题拆解与解决方案

嘿,这个问题其实是typedef匿名结构体和结构体标签的用法混淆导致的,我来给你理清楚:

为什么会报错?

你当前的代码里,typedef是给一个没有标签的匿名结构体定义了别名l2cap_cmd_hdr,但并没有给这个结构体本身指定标签名。

当你在main里写struct l2cap_cmd_hdr head;时,编译器一脸懵:它找不到名为l2cap_cmd_hdr的结构体标签——因为你根本没定义过这个带标签的结构体,只定义了一个代表匿名结构体的typedef别名。

简单总结:

  • l2cap_cmd_hdr是你通过typedef创建的类型名,等价于那个带__attribute__ ((packed))属性的匿名结构体;
  • 但struct l2cap_cmd_hdr这个类型从未被声明过,编译器不知道它的内存大小,所以才会抛出“storage size of ‘head’ isn’t known”的错误。

而你注释里的普通写法,是先定义了带标签的struct l2cap_cmd_hdr,所以main里的声明能被编译器正常识别。

两种可行的解决方案

根据蓝牙头文件的常用写法,这里有两种符合需求的正确写法:

方案一:给结构体加标签,同时完成typedef

这种写法既保留了结构体标签,又创建了typedef别名,兼容两种声明方式:

#include <stdint.h>
typedef struct l2cap_cmd_hdr {
    uint8_t code;
    uint8_t ident;
    uint16_t len;
} __attribute__ ((packed)) l2cap_cmd_hdr;

int main(int argc ,char* argv[]) {
    struct l2cap_cmd_hdr head; // 现在可以正常使用结构体标签声明
    // 或者用更简洁的别名:l2cap_cmd_hdr head;
}

方案二:直接使用typedef别名声明变量

既然已经通过typedef创建了l2cap_cmd_hdr这个类型,那在main里直接用这个别名即可,不需要再加struct前缀:

#include <stdint.h>
typedef struct {
    uint8_t code;
    uint8_t ident;
    uint16_t len;
} __attribute__ ((packed)) l2cap_cmd_hdr;

int main(int argc ,char* argv[]) {
    l2cap_cmd_hdr head; // 直接用typedef的别名声明变量
}

额外提示

蓝牙相关头文件里的typedef struct写法,大多采用第一种(带标签+typedef),这样既兼容C语言传统的struct 标签写法,也能使用更简洁的别名。你只需要记住:要么在typedef时给结构体加上标签,要么在声明变量时直接用typedef的别名,不要混用未定义的结构体标签。

内容的提问来源于stack exchange,提问作者user6747948

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:51:17