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
相关产品推荐
相关产品推荐

