为什么不同的标题具有相同的名称?

我有几个副本,比方说,我的系统上有stddef.h ,一个是/usr/include/linux/stddef.h路径,如下所示:

#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

#endif

另一个路径是/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/include/ ,这就是我说#include <stddef.h>时使用的路径。 该内容与第一个内容大不相同,包含ptrdiff_tsize_t等的定义。

我的问题是:据我所知,C / C ++标准要求size_t的定义应该放在stddef.h ,然而第一个并不遵循这个定义。 这显然不是C / C ++标准提到的那个。 如果该文件出于某种其他目的,为什么这两个文件都命名为stddef.h ,如果它们具有不同的名称,是不是更安全/更清晰?


Linux内核不与c标准库链接,因此 - 作为一般规则 - 标准包含文件无法安全使用,因此linux内核使用自己的包含文件,这些文件已知不依赖c库函数或数据。

任何要在内核空间运行的软件(如内核模块)都应该使用include / linux文件,而不是标准库文件。

内核包含文件显然只包含内核中可能需要的东西,因此是标准c包含文件的一小部分。


我认为其中一个与GCC标准头相关,另一个与内核特定的定义有关。 所以内容在不同范围内有着不同的目的。


C标准要求包含stddef.h足以定义size_t 。 在引擎盖下,它可以被布置,但是图书馆实施者希望。

你会在linux中看到很多,主要是因为很多系统之间的实现不同(例如x86和arm),并且最容易将特定版本放在一个单独的目录中。

注意:但是,在/usr/include/linux/stddef.h的特定情况下,这是一个内核头文件(用于编译内核)。 这并不打算包含在用户空间源代码中。


这个编辑是回复shinkou的评论。 我不知道如何做多行评论,所以这是最简单的方法:

$ cat incltest.c 
#include <stddef.h>

$ cpp -H incltest.c
...
. /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h
...

您可以为任何标题执行此操作。

一般来说,如果你的系统上有多个版本的GCC,你将拥有多个版本的cpp(因此你可以看到不同版本被不同的编译器使用):

$ cpp-4.4 -H incltest.c 
. /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.4.5/include/stddef.h
链接地址: http://www.djcxy.com/p/8667.html

上一篇: Why do different headers have the same name?

下一篇: Attaching keyboard events to an SVG Element inside HTML