您现在的位置是:百科 >>正文

typedef struct和直接struct的区别

百科9282人已围观

简介```html 写C代码时,几乎每个人都会遇到这种写法:typedef struct { int x; int y; } Point;。然后你就可以直接用Point p;声明变量。但如果去掉typed ...

```html

写C代码时,直接几乎每个人都会遇到这种写法:typedef struct { int x; int y; } Point;。直接然后你就可以直接用Point p;声明变量。直接但如果去掉typedef,直接只写struct { int x; int y; };,直接编译器会直接报错——它甚至不给你一个类型名。直接这就是直接最直观的区别:typedef给结构体起了个“别名”,而裸struct只是直接定义了一个匿名类型,你没法在别处引用它。直接

那如果写成struct Point { int x; int y; };呢?直接这就有名字了,但名字是直接struct Point,不是直接Point。每次声明变量都得带上struct关键字:struct Point p;。直接在C语言里,直接struct是直接类型说明符的一部分,不能省略。我见过不少从Java或C++转过来的人,习惯性地写Point p;,然后对着编译错误发呆。C++里确实可以省略,但C不行——这是语言设计的历史包袱,不是编译器故意刁难你。

为什么会有这种差异?得从C的类型系统说起。C里所有类型名都由关键字和标识符组合而成,比如int、char *、struct Point。单独一个Point不是类型名,除非你用typedef把它变成类型别名。所以typedef struct Point Point;这种写法也很常见,先定义结构体标签,再给标签起个别名。标签和别名可以同名,互不干扰——struct Point和Point在编译器眼里是两个不同的东西,虽然它们指代同一块内存布局。

实际项目里,typedef用得更多。Linux内核源码里到处是typedef struct { ... } spinlock_t;这种风格,把结构体定义和类型别名绑在一起,调用者不用关心底层是结构体还是其他类型。但也不是没有反对声音。Linus Torvalds就骂过滥用typedef的行为,他说typedef应该只用于真正隐藏实现细节的场合,比如pid_t这种可能随平台变化的类型。如果只是为了让代码少打几个字,那纯属添乱——你看到struct foo就知道它是个结构体,看到foo_t反而得去翻定义。

还有个细节:匿名结构体加typedef时,你没法在结构体内部引用自己。比如写链表节点:typedef struct { struct Node *next; } Node;会报错,因为struct Node还没定义。必须写成typedef struct Node { struct Node *next; } Node;,先给标签Node,再给别名Node。这个坑我踩过好几次,每次都得愣一下才反应过来。

从编译器的角度看,typedef不产生任何运行时代码,它纯粹是给编译器看的符号表条目。所以别指望用typedef来优化性能——它连一个字节都不会省。有人觉得typedef struct比struct“更现代”,这完全是错觉。C89标准里typedef就存在了,而C++里struct默认就是类型名,不需要typedef。如果你写的是C代码,用不用typedef取决于团队规范;如果写的是C++,那typedef struct基本是多余的,除非你要兼容C的头文件。

最后说个冷门点:typedef可以给同一个类型起多个别名,比如typedef struct Point Point;之后还能typedef Point Coordinate;。但裸struct定义只能有一个标签,而且标签的作用域受限于声明位置——在函数内部定义的结构体标签,出了函数就没了。所以如果你在头文件里写struct Foo { ... };,其他源文件包含这个头文件后,得用struct Foo来声明变量。换成typedef版本,直接写Foo就行。这种便利性在大型项目里能省不少事,但也容易让人忘记底层类型到底是什么。

```

Tags:

相关文章

  • 有人能打通北京市刑侦总队电话吗

    百科

    昨天下午三点十七分,我拨了北京市刑侦总队的公开号码。不是报案,纯粹好奇——网上总有人说这电话打不通,我想验证一下。 响了三声,通了。一个男声,语速很快:“您好,刑侦总队。”我愣了一下,说打错了,赶紧挂 ...

    【百科】

    阅读更多
  • csgo开箱网站最新

    百科

    CSGO开箱网站最近又死了一批。不是那种小打小闹的关停,是连着好几家头部站点直接跑路,玩家充进去的钱连个响儿都没听见。我有个朋友上个月刚在某知名网站上砸了三千块追一把蝴蝶刀,结果第二天网站首页挂出“系 ...

    【百科】

    阅读更多
  • 如何对一个网站进行渗透测试

    百科

    如何对一个网站进行渗透测试 真正的渗透测试不是拿扫描器跑一遍就完事。我见过太多所谓“安全工程师”开着Nessus扫出几个高危漏洞,截图丢进报告里交差,结果客户的生产环境被一个未授权访问的接口捅穿——那 ...

    【百科】

    阅读更多


友情链接