私が理解するのに苦労していることの1つは、コンパイラーがどのように機能するかです。私はそれで多くの問題を抱えていますが、特に私はヘッダーとライブラリを混同し続けています。誰かが少し物事を片付けることができれば、それは素晴らしいことです。
回答:
両方をこのように考えてください(免責事項:これは本当に高レベルのアナロジーです;)..
これが「インターフェース」と「実装」の根本的な違いです。インターフェース(ヘッダ)がわかりますどのようにしながら、(それがどのように動作するかを知らずに)いくつかの機能を呼び出すために実装(ライブラリ)が実際の機能です。
注:この概念は非常に基本的です。柔軟性が得られるためです。異なるライブラリーに対して同じヘッダーを持つことができ(つまり、機能はまったく同じ方法で呼び出されます)、各ライブラリーは異なる方法で機能を実装できます。同じインターフェイスを維持することで、コードを変更せずにライブラリを置き換えることができます。
そして:呼び出し元のコードを壊すことなく、ライブラリの実装を変更できます!
Util.lib
。例それを関数と呼ぶ方法は?Uにも関連するヘッダーファイルをインクルードする必要がありますtil.lib
か?
ヘッダファイルがされ、一般的にアプリケーション内のインターフェイスのインターフェイスまたはセットを定義するために使用されます。ヘッダーファイルは、技術的な実装の詳細を省略しながら、プログラムの外部機能を示すものと考えてください。
たとえば、プログラムを最適化する場合、アルゴリズムを改善するためにソース(.cpp)ファイルを変更する可能性がありますが、外部クライアントは引き続き同じパラメーターセットを使用してメソッドを呼び出すため、ヘッダーファイルは変更されません。戻り値。
C ++のようなオブジェクト指向言語では、ヘッダーファイルには通常次のものが含まれます。
コードがヘッダーファイルに実装されるのを妨げるものは何もありませんが、コードに余分な結合と依存関係が生じる可能性があるため、これは一般的には好ましくありません。
場合によっては(テンプレートクラスなど)、技術的な理由から、実装をヘッダーファイルで定義する必要があります。
ライブラリは、あなたがプログラムまたはプログラムのグループに利用できるようにするコードの集まりです。これには、特定のインターフェースまたはインターフェースのセットの実装が含まれます。
コードは、コードの重複を防ぎ、再利用を促進するためにライブラリで定義されています。ライブラリは、静的リンク(.lib)または動的リンク(.dll)にすることができます。
静的にリンクされたライブラリーは、その後、ビルドプロセスのリンク段階で最終的な実行可能ファイル(.exe)に連結されている(メソッドの定義と考えることができる)エクスポート・シンボルのセットを定義します。これには、実行時間が短縮されるという利点があります(ライブラリを動的にロードする必要がないため)。ただし、バイナリが大きくなります(メソッドは基本的に実行可能ファイルに複製されるため)。
動的にリンクされたライブラリは、プログラムの実行ではなく、プログラムのリンク時にリンクされています。複数のプログラムが同じ方法を再利用する必要がある場合に役立ち、COMなどのテクノロジで広く使用されています。
ライブラリはコードであり、オブジェクトファイルのセットにコンパイルされます。オブジェクトファイルには、コンパイルされたマシンコードと、コードで使用されるデータ宣言が含まれています。
ヘッダーファイルは、ライブラリへのインターフェイスを定義します。ライブラリを正しく使用する方法を説明します。C / C ++では、ヘッダーファイルは関数名とそれらの関数の呼び出し方法のリストを提供します:それらが取るパラメーターの数とタイプ、戻り値の型、呼び出し規約など。ヘッダーファイルには他にもたくさんのものがあります。それらも同様ですが、結局のところ、ライブラリコードを呼び出すための一連のルールです。
ヘッダーには宣言のみが含まれますが、ライブラリには実装も含まれます。
プログラミング言語のライブラリが一般的なライブラリである場合、ライブラリに存在する多くの本を言語の関数/メソッドと比較できます。また、ヘッダーファイルを本の行番号と比較することもできます。ハイデラバードのある図書館に本があり、その図書館にその本が行番号24にあるとします...図書館の住所が指定されているのと同じ方法です。名前付けstd(標準ライブラリ用)と行Noを使用することにより、同時にすべての本(この場合はメソッド)(入力/出力ストリームに関連するすべてのメソッド)が配置されるヘッダーファイルによって指定されます
ヘッダーは通常、プロトタイプを格納するために使用されます。ヘッダーは前処理時に拡張されるため、コンパイル時にコードは関連する関数宣言/プロトタイプにアクセスできます。
ライブラリは、関数プロトタイプの定義を含む実際のソフトウェアです(ヘッダーにあります)。ライブラリはリンク時に使用されます。定義(ライブラリに存在する)はリンク時に解決されます。
プログラムでのHEADERファイルとLIBRARYの動作。
ヘッダーファイルはへのリンク含まライブラリ全て解決さディレクティブ(ディレクティブは、プログラム内の行には、#記号が先行していることを(ライブラリは、標準的な機能および方法を含む)、コンパイラは、プリプロセッサを介してソースコードで使用される標準的な機能を認識する)プログラムの実際のコンパイルの前。
読んでくれてありがとう!
ライブラリは、何度も再利用され、そのコードがプリコンパイルされているコードのパッケージであると思います。したがって、標準形式で利用できるため、開発するすべてのプログラムに対してそのコードを記述する必要はありません。また、ヘッダーファイルには、「cin」や「cout」などのプログラムで使用する関数が標準ライブラリで完全に定義されている簡単な方法でそのコードへの参照が含まれ、iostreamヘッダーファイルなどのヘッダーファイルにはそのコードへの参照が含まれます。したがって、コードをコンパイルすると、cinとcoutのプリコンパイルが行われるだけで、使用するたびにcinとcoutのコードを記述する必要はありません。または、より簡単な方法で、ライブラリにはすべての関数のコードが含まれており、ヘッダーファイルがそのコードに到達する方法であると言えます。
ライブラリは、時々使用するための同様のオブジェクトのコレクションです。通常、オブジェクトまたはソースコード形式のプログラム、テンプレートなどが含まれます。
ヘッダーファイルは、ライブラリの場所(インターフェイス)です。
図書館は死んだミイラのようなもので、白い長い糸で包まれています。彼らは死んでいます。それらを解放する唯一の方法は、ヘッダーファイルを使用することです。ヘッダーファイルには、それらを実現する方法が含まれており、何度も実現できます(コードの再利用)。
あなたはunderstand-にこの例を考えることができるMath.h
ような関数呼び出しのプロトタイプ含むヘッダファイルであるsqrt()
、pow()
一方、などlibm.lib
、libmmd.lib
、libmmd.dll
数学ライブラリの一部です。簡単に言うと、ヘッダーファイルは名刺のようなもので、図書館は実在の人物のようなものなので、名刺(ヘッダーファイル)を使用して実際の人物(図書館)にアクセスします。
ライブラリからのコードは、ヘッダーファイルの必要に応じてのみ保存されます。ヘッダーファイル全体が保存されるため、プロセッサのストレージ領域が節約されます。