__PTRDIFF_TYPE__与ptrdiff_t

我不明白为什么gnu C编译器使用两个具有几乎相似名称的不同宏 – __PTRDIFF_TYPE__ptrdiff_t – ,因为它们与语义相同。

这些宏的定义在这里 。

我问了一个关于这个问题的类似问题。

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

有人可以清楚地详细解释gnu C编译器如何使用它们吗?

编辑:

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

ptrdiff_t不是宏,它是由stddef.h定义的typedef名称。 它在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文档非常明确,只要您阅读完整段落:

这些宏被定义为[一堆标准指定的typedef名称]的正确底层类型。 它们的存在使标准头文件stddef.hstdint.hwchar.h正常工作。 你不应该直接使用这些宏; 相反,包括适当的标头并使用typedef。

强调我的。)