__PTRDIFF_TYPE__与ptrdiff_t

时间:2016-06-25 19:08:42

标签: c

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

这些宏的定义是here

我问过类似的问题concerning this问题。

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

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

编辑:

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

1 个答案:

答案 0 :(得分:8)

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,在int模式下为-m32。编译器必须知道哪个整数类型用于两个指针的差异,因此它也可以公开该信息而不是使stddef.h重复所有相同的逻辑。

(如果您阅读整个段落,您引用的GCC文档非常清楚:

  

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

强调我的。)