为什么不同的标题具有相同的名称?
我有几个副本,比方说,我的系统上有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_t
, size_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