在C语言中,ptrdiff_t的定义在哪里?

58

ptrdiff_t在C中的定义在哪里?

3个回答

70

这个定义在stddef.h中。


该头文件定义了整数类型size_tptrdiff_twchar_t,功能宏offsetof和常量宏NULL


2
而且,其中只有 ptrdiff_toffsetof 没有在任何其他地方定义;另外三个也由许多其他头文件定义。 - Jonathan Leffler
15
真正的 stddef.h 文件藏在 /usr/lib/gcc/TARGET/VERSION/include 目录下,还有许多其他的头文件也属于 GCC 而不是 C 库(并且可能与 GCC 版本有关)。linux/stddef.h 只用于内核代码(我实在不明白为什么他们要有自己的副本)。你可能会发现使用 -H 开关调用 gcc 命令可以帮助你调查这种问题。 - zwol
@Zack:你的评论本身就可以作为一个答案。感谢你澄清了这一点。 - Matt Joiner
@Zack -r--r--r-- 1 root wheel 2246 Dec 4 04:33 /usr/include/stddef.h - 不会隐藏在/usr/lib中,这是有充分理由的。 - Good Person
2
@GoodPerson,你的操作系统不是基于GNU-libc的。许多其他C库提供自己的stddef.h,但glibc则交由编译器处理。无论如何,如果你有GCC,请观察echo '#include <stddef.h>' | gcc -E -H -xc - > /dev/null打印出来的内容。 - zwol
显示剩余3条评论

1
如果您正在查找Visual Studio 2015或更新版本中的ptrdiff_t,请注意,微软再次打破了所有可能的惯例,他们的版本的stddef.h没有定义ptrdiff_t,自从Visual Studio 2015以来,它已成为通用CRT(Windows SDK的一部分)的一部分。
现在,stddef.h中的所有类型定义都位于vcruntime.h中——只有offsetof()仍位于stddef.h中。您应该包含stdint.h而不是包含stddef.h,因为后者包含vcruntime.h
如果您需要跨平台工作或使用旧版本的Visual Studio,则可以使用以下内容:
#if defined(_MSC_VER) && (_MSC_VER >= 1900) // UCRT was introduced in VS 2015
#include <stdint.h>
#else
#include <stddef.h>
#endif

-1

3
ptrdiff_t 完全按照 C 语言标准在 <stddef.h> 中定义。在这种情况下,POSIX 是完全无关紧要的。 - AnT stands with Russia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接