![Linux 中 stddef.h 在哪里定义?](https://linux22.com/image/135644/Linux%20%E4%B8%AD%20stddef.h%20%E5%9C%A8%E5%93%AA%E9%87%8C%E5%AE%9A%E4%B9%89%EF%BC%9F.png)
如果我想找到 的值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
宏。