【问题标题】:Why is size_t in stddef and not stdint?为什么 stddef 中的 size_t 而不是 stdint?
【发布时间】:2018-06-17 01:58:37
【问题描述】:

我只是想知道为什么像uintptr_t 这样的东西在stdint.h 中,而像size_t 这样的其他类型在stddef.h 中?这些标头背后有逻辑吗?

【问题讨论】:

  • stdint 较新,移动它们会破坏现有代码?
  • 不知道。所以这是一个遗产。想知道谁认为值得为较新的 int 类型包含另一个文件? stddef 实际上听起来像是一个更好更通用的包含文件。
  • 因为stddef.h 真的很小。它几乎没有任何内容,其目的是让您包含可能已经成为核心语言一部分的类型和宏,甚至不用担心从标题中包含它。 stdint.h 可能是一个更大的文件,而且许多类型甚至不能保证存在。
  • ssize_t 不是由 C 定义的。它是由 POSIX 定义的,它在 <sys/types.h><unistd.h> 中声明它。我认为如果您提到size_t 而不是ssize_t,您的问题会更有意义。
  • @KeithThompson ekk 这是一个错字

标签: c types header c99 stdint


【解决方案1】:

推理很大程度上是惯例和历史问题。

<stddef.h>size_t 至少从 1989 年的 C ANSI 标准(1978 年的书C 编程语言 没有提及标题或size_t 和@987654325 @ 表达式的类型为 int - 这在处理器的“自然字长”也是系统上地址和索引的大小的生态系统中是有意义的。

<inttypes.h><stdint.h> 被添加到 1999 年修订的标准 C 中,C99 Rationale 中解释了它们的存在。

<inttypes.h> 派生自多个现有 64 位系统上的同名标头。委员会讨论了指定整数大小和其他特征的其他方法,但最终决定标准化现有实践而不是在该领域进行创新。 ... <stdint.h><inttypes.h> 的子集,更适合在可能不支持格式化 I/O 功能的独立环境中使用。在托管环境中,如果不需要格式化的转换目标,则使用此标头而不是 <inttypes.h> 可以避免定义如此大量的宏。

【讨论】:

  • 我找不到这方面的来源,但我有一种预感 size_t 首次出现在 <sys/types.h> 中,这是 1978 年 TCPL 中提到的 UNIX 标头,具有讽刺意味的是包含您的标头错字ssize_t.
  • 就标准标题而言,<stddef.h> 是 C 标准委员会在 C89/C90 中的一项发明,其中包含一些没有比这更好的地方的项目——其中包括 size_tptrdiff_toffsetofNULL。正如你所说,<stdint.h> 是在 C99 中添加的。虽然size_t 也可以添加到该标题中,但实际上并没有必要这样做。该标头涵盖了与 size_t 不同的整数类型样式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2012-04-27
  • 2010-10-18
相关资源
最近更新 更多