web-dev-qa-db-ja.com

1つのライブラリ(C標準ライブラリ)に複数のヘッダーファイルを含める必要があるのはなぜですか?

C標準ライブラリ(stdio.h、stdlib.h、math.h)のヘッダーファイルが非常に多い理由はわかりません。

これらのヘッダーファイルは同じライブラリをどのようにポイントしますか?

私は実際にはライブラリとは何かについて少し混乱していると思います。どこにあるの?ライブラリは、ヘッダーファイルを介してプログラムにリンクされていませんか?

2
yoyo_fun

ヘッダーには通常、ライブラリーに存在する関数(およびクラスなど)をコンパイラーに伝えるための宣言が含まれています。

ほとんどのCおよびC++コンパイラには、デフォルトでリンクする標準ライブラリが含まれています。他のライブラリとリンクするには、通常、コンパイラ(実際には、少なくともほとんどの場合、リンカー)にリンクするように指示する必要があります。

なぜそれほど多くのヘッダーがあるのか​​については、主に多くの宣言があり、その多くは最小限の相互関係しかないためです。ヘッダーには(通常)ソースコードが含まれているため、ヘッダーを含むファイルをコンパイルするたびに、そのヘッダー全体を再コンパイルすることもできます。これにより、コンパイル速度が大幅に低下する可能性があります(とにかく、CおよびC++ではコンパイル速度が問題になることがよくあります)。

ライブラリ自体には通常、2つの形式があります。1つは「静的ライブラリ」です。これは基本的に、1つのファイルにまとめられたオブジェクトファイルの集まりです。多くの場合、どのファイルにどの関数が含まれているかを簡単に見つけることができるように、何らかのディレクトリが追加されています。リンカは基本的に、ディレクトリを調べて、コードで現在未解決の外部参照を満たすファイルを見つけ、他のオブジェクトファイルと同じようにリンクします。

2つ目は動的ライブラリです(例:DLL、Linuxでは.so)。これは実行可能プログラムに似ています-ロード可能なファイルに事前にリンクされたオブジェクトファイルのセットフォームにリンクします。リンカーは、動的ライブラリへの何らかの参照を実行可能ファイルに挿入します。プログラムを実行すると、OSのローダーが動的ライブラリをプロセスのアドレス空間にマップし、ダイナミックライブラリ内の関数への参照。ライブラリ内の正しいアドレスを参照します。

8
Jerry Coffin

新しい識別子

Cは長年にわたって、さまざまな新しい標準ライブラリ関数、タイプ、定義などを追加してきました。

古いコードがこれらの新しい識別子のいくつかを以前に使用していた可能性があります。

古典的な例はbool,true,false「新しい」で定義<stdbool.h>

新しいコンパイラを使用した古いコードの再コンパイルが失敗しないようにするには、bool,true,falseは、以前は存在しなかった現在の標準インクルードファイルで定義されています。したがって、古いコードには含まれておらず、競合は発生しません。

以下は includes C89以降に追加されたものです

<assert.h>
<fenv.h>
<inttypes.h>
<iso646.h>
<stdalign.h>
<stdatomic.h>
<stdbool.h>
<stdint.h>
<stdnoreturn.h>
<tgmath.h>
<threads.h>
<uchar.h>
<wchar.h>
<wctype.h>

ライブラリセグメンテーション

Cライブラリは1つの大きなエンティティである可能性がありますが、歴史的には分割されていましたが、浮動小数点mathは、そのサイズと多くのCに適用できないため、別々に処理されていましたFP mathのないプログラム。したがって、標準Cライブラリのいくつかのチャンクを含む選択ヘッダーファイルのいくつかの配置がありました。ヘッダーを含まないコードは、ライブラリのそのチャンクを必要としない可能性があります。