Linux 中 stddef.h 在哪里定义?

Linux 中 stddef.h 在哪里定义?

如果我想找到 的值stddef.h,它在哪里定义?几乎/usr/include/linux/stddef.h什么都没有,

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef __always_inline
#define __always_inline __inline__
#endif

具体来说,我想看看是如何size_t定义的?

几个月后回到这个同样的问题想知道如何whcar_t定义。

请注意,内部stddef.h文件的 typedef 为 ,

  • ptrdiff_t
  • max_align_t
  • size_t
  • wchar_t

答案1

C 标准不区分编译器功能和库功能。区别在于实现细节,并且可能因平台而异,但有共同的趋势。例如,基本整数类型(例如 和 )的大小size_t以及相关宏(例如CHAR_BIT和 )SIZE_MAX是编译器和编译器选项的属性;另一方面, 的内容stdio.h通常独立于编译器,但取决于标准库如何实现文件。

stddef.h主要声明编译器的东西,所以它是编译器自带的。例如,如果在 32 位或 64 位模式下编译,您最好获得不同的定义,并且使用 GCC 和 Clang 等您将获得不同的定义。所以在编译器目录中查找它。有些编译器甚至根本没有磁盘文件,它们只是<stddef.h>特殊处理名称,但使用 GCC 和 Clang 你确实会得到一个磁盘文件。

您可以使用以下命令找到系统上的所有副本locate

如果你想知道GCC 使用的包含路径是什么当给定特定选项时,除了您在构建中使用的其他选项(尤其是)-v之外,还要在命令行上传递该选项。-m

如果您只需要此信息而不编译任何内容,请在仅预处理器模式下使用空输入调用 GCC(-xc -E /dev/null;您需要 a-xc来指定语言为 c,因为 GCC 无法在没有文件名的情况下判断您正在编译的语言)。

顺便说一句,同样的选项也适用于 Clang。

gcc -v -xc -E /dev/null 2>&1 |
awk ' /^End of search list/ {exit} p {print} /^#include <\.\.\.> search starts here:/ {p=1}' |
xargs sh -c 'for x; do if [ -e "$x/stddef.h" ]; then echo "$x/stddef.h"; exit; fi; done' sh

如果您只想知道 的定义size_t,那么您不需要知道它来自哪里。要求编译器打印预处理器的输出。

echo '#include <stddef.h>' | gcc -xc -E - | grep size_t

man gcc

  • -E 预处理阶段结束后停止;不要正确运行编译器。输出采用预处理源代码的形式,发送到标准输出。不需要预处理的输入文件将被忽略。
  • -x language显式指定以下输入文件的语言(而不是让编译器根据文件名后缀选择默认语言)。此选项适用于所有后续输入文件,直到下一个-x选项。

答案2

-H只需在编译源代码并检查输出时添加标志,您就会看到 的位置stddef.h,例如

gcc file.c -H

答案3

size_t定义于/usr/include/sys/types.h

请注意,您可能需要遵循该文件中的 #includes 才能找到真正的定义。

stddef.h只是一个元包含文件,该文件中唯一唯一的定义是offsetof宏。

相关内容