typedef struct vs struct - “struct”的存储大小未知[重复]
Posted
技术标签:
【中文标题】typedef struct vs struct - “struct”的存储大小未知[重复]【英文标题】:typedef struct vs struct - storage size of ‘struct' isn’t known [duplicate] 【发布时间】:2018-03-23 13:04:11 【问题描述】:我正在尝试自己的蓝牙编程,但遇到了这个我不明白的问题。基本上,当我使用 typedef 结构定义时,编译器会抛出错误:
temp_testcode.c:11:23: error: storage size of ‘head’ isn’t known
通过gcc temp_testcode.c
简单编译的代码如下:
#include <stdint.h>
typedef struct
uint8_t code;
uint8_t ident;
uint16_t len;
__attribute__ ((packed)) l2cap_cmd_hdr;
/**
struct l2cap_cmd_hdr
uint8_t code;
uint8_t ident;
uint16_t len;
;
*/
int main(int argc ,char* argv[])
struct l2cap_cmd_hdr head;
虽然一旦我使用结构的较低定义(当前已注释掉),代码编译得非常好。所以要么是 typedef struct 的问题,要么是 __attribute__ ((packed))
的问题之前关于 typedef 结构的 *** 帖子对我没有帮助 (typedef struct vs struct definitions),因为 我不知道如何使用 typedef 结构使 main 方法中的结构初始化工作 em> (而不是我目前注释掉的版本)。一些必要的东西,因为蓝牙头文件都这样定义它们的结构。
所以:
如何使用 typedef struct 使 main 方法中的结构初始化工作? 为什么我的代码不起作用?感谢您的宝贵时间和帮助!
【问题讨论】:
你试过了吗:struct l2cap_cmd_hdr head;
-> l2cap_cmd_hdr head;
如果你使用 typedef 然后试试l2cap_cmd_hdr head;
好的,这个答案已经解决了。我想这很简单。非常感谢你!虽然我仍然想知道为什么会这样。
如果您使用的是 C++,则没有真正的理由使用 typedef 结构。如果您使用 C,常见的习惯用法是两者都做,以避免必须使用 struct
作为关键字来说明您的类实际上是一个结构。也就是说,您永远不应该将关键字struct
与 typedef 结构一起使用,并且您不应该在 C++ 中使用 typedef 结构(尽管您应该在 C++ 中使用)。一个常见的成语是typedef struct x ... x;
,两全其美。
【参考方案1】:
Typedef 和结构位于两个不同的命名空间中。这意味着 typedef l2cap_cmd_hdr
与结构 struct l2cap_cmd_hdr
不同。
您正在尝试创建后者的实例,但该实例不存在。您确实有一个匿名结构的实例,其类型定义为 l2cap_cmd_hdr
,因此您可以创建它:
l2cap_cmd_hdr head;
【讨论】:
但每次我执行此任务时,它都会创建一个单独的结构实例,不是吗?所以l2cap_cmd_hdr head1; l2cal_cmd_hdr head2;
将是两个不同的实例,它们的值不会相同!?
@PPP 没错。上面的语句定义了引用结构的一个实例。如果您只需要一次实例,只需创建一个。如果你需要两个然后创建两个。以上是关于typedef struct vs struct - “struct”的存储大小未知[重复]的主要内容,如果未能解决你的问题,请参考以下文章
C : typedef 结构名称 ...; VS typedef struct... 名称;
typedef vs struct/union/enum 背后的基本原理是啥,难道不能只有一个命名空间吗?
C语言结构体中struct和typedef struct有啥区别?