2011-07-19 18 views
7

私は1つのパス/usr/include/linux/stddef.hであり、そしてこのようになります、のは、私のシステムで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>と言うときに使用されます。その1の内容は、最初の1から多くの異なる、ptrdiff_tの定義が含まれ、size_tなど

は、私の質問は:私の知る限りでは、C/C++の規格がsize_tの定義はに置かれるべきことを要求しますstddef.hしかし、最初のものはそれに従わない。それは明らかにC/C++標準で言及されたものではありません。そのファイルが他の目的で使用されている場合、なぜこれらのファイルの両方がstddef.hという名前になっていても、名前が違うともっと安全ではないでしょうか?

+0

これはむしろ怪しげに見えます。修飾されたガードワードは、意図的にstddef.hとして偽装していないことを暗示しているようです。どのパッケージから来たのか確認できますか? – Cheezmeister

+0

@Cheezmeister: 'apt-file'は、 ' linux-libc-dev:/ usr/include/linux/stddefです。hu と 'gcc-4.5:/ usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/include/stddef.h' – loudandclear

+0

@Cheezmeisterです。私はあなたを二番目に。 '/ usr/include/linux/stddef.h'というパス名は**標準ヘッダ**を意味しません。私のLinux(Slackware64 13)のコピーには '/ usr/include'の下に' stddef.h 'はありません。 – shinkou

答えて

3

Linuxカーネルを標準的なインクルードファイルは安全に使うことができないので、linuxカーネルはcライブラリの関数やデータに依存しない独自のインクルードファイルを使います。

カーネルモジュールなどのカーネル空間で実行するソフトウェアは、標準のライブラリファイルではなくinclude/linuxファイルを使用する必要があります。

明らかに、カーネルインクルードファイルはカーネルで必要と思われるものだけをカバーするので、標準インクルードファイルのサブセットは非常に小さいです。

0

size_tを定義するには、C標準では、stddef.hを含むことが必要です。このフードの下では、それはライブラリの実装者が望むものだが、レイアウトすることができる。

多くの実装がシステム(x86 vs armなど)によって異なり、特定のバージョンを別のディレクトリに置くのが最も簡単なため、これはLinuxで多くのことがわかります。

注:ただし、/usr/include/linux/stddef.hという特定のケースでは、これはカーネルヘッダー(カーネルをコンパイルするためのもの)です。これはユーザー空間のソースコードに含まれていたものではありません。


この編集は振興さんのコメントに返信することです。私は複数のコメントを行う方法を知らないので、これが最も簡単な方法です:

$ 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 
+0

それも私が理解していることです。しかし、 '/ usr/include/stddef.h'が存在しない理由を説明することができますか(例えば、Slackwareのようなディストリビューションの中には)? – shinkou

+0

複数のlibcディストリビューション(そして複数のバージョンのstddef.h)を配布できるようにするには、どうすれば実装できますか?あなたはおそらくそれを別のディレクトリに置くでしょう。 GCCはそれを別々のディレクトリに保持し、コンパイラはバージョン固有のヘッダーを所定のディレクトリに自動的に追加します。 - ちょうどチェックされて、cpp -Hがどのヘッダが使われているかを教えてくれる –

+0

'/ usr/include/linux/stddef.h'がカーネルコンパイルのみを使うのであれば、* real *' stddef.h 'それではユーザー空間のために? 'find/usr/include -type f -name stddef.h'は私のマシン上で'/usr/include/linux/stddef.h'を返します。 – shinkou

0

私はGCC標準ヘッダーに関連していると思います。もう1つはカーネル固有の定義に関係していると思います。したがって、内容は異なる目的で同じ目的で異なっています。

関連する問題