gpt4 book ai didi

c - __PTRDIFF_TYPE__ 与 ptrdiff_t

转载 作者:行者123 更新时间:2023-12-04 11:32:39 27 4
gpt4 key购买 nike

我不明白为什么 gnu C 编译器使用 2 个名称几乎相似的不同宏 - __PTRDIFF_TYPE__ptrdiff_t - 因为它们与语义相同.

这些宏的定义是here .

我问了一个类似的问题 concerning this问题。

我重复了这个问题,因为在我的第一篇文章中我没有收到我真正需要的答案。

有人能详细解释一下 gnu C 编译器是如何使用它们的吗?

编辑:

这篇文章的目的是了解gcc从生成lexeme流并插入解析器的那一刻到完成语义检查并生成IC的那一刻,如何具体使用这个对象(指针差异类型)。

最佳答案

ptrdiff_t 不是宏,它是 typedef 名称,由 stddef.h 定义。在 C 标准中,它被指定为两个指针之间差异的类型。

__PTRDIFF_TYPE__ 是 GCC 的 stddef.h 的实现细节。除非您正在编写 C 运行时库,否则不应使用它。

两者都存在的原因是C编译器不允许无条件定义ptrdiff_t。如果您包含 stddef.h,则该名称仅获得其标准指定的含义;否则它可用于应用程序使用。 (请注意,与 C++ 不同,在 C 中,标准库头文件不允许 [表现得好像它们] 相互包含。)另一方面,__PTRDIFF_TYPE__ 允许编译器无条件定义的名称,因为它以两个下划线开头。所以 __PTRDIFF_TYPE__ 是无条件预定义的,stddef.h 在适当的时候使用它来定义 ptrdiff_t

stddef.h 的原因是通过这种间接方式,而不是裸露的

typedef long int ptrdiff_t;  /* or whatever */

是因为定义可能需要根据编译模式而有所不同。例如,在 x86-64/Linux 上,ptrdiff_t 在默认模式下是 long int 而在 -m32 中是 int > 模式。编译器必须知道使用哪种整数类型来区分两个指针,因此它也可以公开该信息,而不是让 stddef.h 重复所有相同的逻辑。

(您引用的 GCC 文档对此非常清楚,前提是您阅读了整个段落:

These macros are defined to the correct underlying types for [a bunch of standard-specified typedef names]. They exist to make the standard header files stddef.h, stdint.h, and wchar.h work correctly. You should not use these macros directly; instead, include the appropriate headers and use the typedefs.

强调我的。)

关于c - __PTRDIFF_TYPE__ 与 ptrdiff_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com