我不明白为什么gnu C编译器使用两个名称几乎相似的不同宏 - __PTRDIFF_TYPE__
和ptrdiff_t
- ,因为它们与语义相同。
这些宏的定义是here。
我问过类似的问题concerning this问题。
我复制了这个问题,因为在我的第一篇文章中,我没有收到我真正需要的答案。
有人可以清楚地详细解释gnu C编译器如何使用它们吗?
编辑:
这篇文章的目的是了解gcc如何具体地使用这个对象(指针差异类型),从生成词汇流并插入解析器的那一刻到语义检查完成并生成IC的那一刻。
答案 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.h
,stdint.h
和wchar.h
正常工作。你不应该直接使用这些宏;相反,请包含适当的标头并使用typedef。
强调我的。)