【问题标题】:Why does __uint8_t exist?为什么 __uint8_t 存在?
【发布时间】:2020-10-15 16:24:33
【问题描述】:

为了更好地理解 libc 的工作原理,我阅读了 FreeBSD 源代码。在那里我偶然发现了 sys/_types.h 文件中 __uint8_t 的定义。我可以理解类型的定义,如 u_int8_t 以与旧代码兼容,但是一个特殊的 _types.h 文件,其中所有类型都以 __?为什么这些类型在 types.h 附带的 _types.h 文件中定义,而不仅仅是 types.h 与标准 uint8_t 等其他类型完全一致?

(我假设这些以__开头的类型没有定义为与旧代码兼容,因为它没有写在注释中)

【问题讨论】:

  • @user4581301 我没有关注该链接,但值得注意的是,C 和 C++ 之间的双下划线规则不同。 C 只保留以双下划线(或下划线后跟大写字母)开头的标识符,而 C++ 保留所有使用双下划线的标识符,无论它出现在哪里。
  • 再想一想,既然问题是关于libc的,我要拉链接和C++标签。
  • 只是一个想法:libc 是特定环境实现的一部分。编写标准库(独立环境)的规则与编写托管程序的规则不同。再次只是一个想法。
  • 我不确定;但是 FreBSD 的源代码有很长的历史(可以追溯到 1970 年代的原始 BSD)并且stdint.h 更新很多(可能是 2001 年?);所以可能 FreeBSD 在有标准之前就使用了它们的“非标准”类型,而在引入 stdint.h 之后继续使用它们(以避免改变一切)。
  • @Brendan C99 标准中引入了固定宽度(以及快速/最小变体)。

标签: c types libc


【解决方案1】:

为什么 __uint8_t 存在?

提供对不与用户代码冲突的实现的 8 位无符号类型的访问。


一个特殊的 _types.h 文件,其中所有类型都以 __ 开头

__ 名称由实现保留,因此使用该名称不会与用户代码冲突。


为什么这些类型定义在 types.h 附带的 _types.h 文件中,而不只是 types.h 与标准 uint8_t 等其他类型一起定义?

所以实现可以包含它自己的文件,而不包括各种 STD C .h 文件。

uint8_t<stdint.h> 中定义。在那里定义__xxx_t 也会引入其他可能与用户代码冲突的定义。合规的用户代码不需要包含<stdint.h>

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 2010-11-12
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多