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有啥区别?

???????????????struct???typedef struct

struct & typedef struct用法详解

(转) struct 和 typedef struct