__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.h
,stdint.h
和wchar.h
正常工作。 你不应该直接使用这些宏; 相反,包括适当的标头并使用typedef。
强调我的。)