#includeはどのように働いていますか?

2118 ワード

多くの園友は「#include」に詳しいかもしれません.C/C++プログラムを書くときに書く文字列の一つですが、具体的にはどのように働いていますか.あるいはその原理は何ですか?あまり詳しくないかもしれませんが、気にしたことがないかもしれません.プログラムが正しく実行されるかどうか、プログラムがどのように実現されるかなどの問題だけに関心を持っています.
ここで筆者は私たちがよく知っていてよく知らない「#include」を紹介するために、まずC/C++ヘッダファイルを理解します.
ヘッダファイルは、関連宣言にセットされた場所を提供します.ヘッダファイルには、一般的にクラスの定義、extern変数宣言、関数宣言が含まれます.ここで宣言と定義の違いに注意してください.最も本質的な違いは、定義が1回しか現れず、宣言が複数回現れることです.スペースを割り当てるのではなく、スペースを割り当てるように定義することを宣言します.ヘッダファイルが正しく使用されると、すべてのファイルが特定のエンティティの同じ宣言を使用することを保証できます.宣言を変更する必要がある場合は、ヘッダファイルのみが更新する必要があります.
ヘッダファイルは、コンパイル時にその値が分かったcosntオブジェクトとinline関数を定義することもできます.ヘッダファイルで上記のエンティティを定義するのは、コンパイラがコードを生成するために定義する必要があるためです.たとえば、クラスを定義または使用できるオブジェクトコードを生成するには、コンパイラがそのタイプを構成するデータ・メンバーを知っているか、対応する関数を知っている必要があります.
C++では、定数式を配置する必要がある場所があります.たとえば、列挙メンバーの初期化は定数式でなければなりません.定数式は、コンパイラがコンパイル時に結果を計算できる式です.このconst整数変数は、const整数変数が定数式によって自己初期化されると、定数式である可能性があります.const変数が定数式になるには、初期化がコンパイラに表示される必要があります.複数のファイルに同じ定数値を使用できるように、const変数とその初期化は、各ファイルに表示される必要があります.したがって、その定義をヘッダファイルに配置すると、const定数がいつ使用されても、コンパイラは初期化を知ることができます.
#includeはどのように働いていますか?
#include施設はC++プリプロセッサの一部です.
プリプロセッサプロセッサプロセッサのソースコードは、コンパイラの前に実行されます.
#includeは、ヘッダファイル名のパラメータを1つだけ受け入れます.
プリプロセッサは、各includeを指定したヘッダファイルの内容で置き換えます.
私たち自身のヘッダファイルはファイルに格納されます.システムのヘッダファイルは、コンパイラ固有のより効率的なフォーマットで保存される場合があります.
ヘッダファイルは、常に他のヘッダファイルをincludeします.ヘッダファイル定義のエンティティは、他のファイルの施設でよく使用されます.したがって、設計されたヘッダファイルは、同じソースファイルに複数回含まれるようにする必要があります.同じヘッダファイルを含むクラスとオブジェクトが複数回定義されないことを保証する必要があります.ヘッダファイルを安全にするには、プリプロセッサを使用してヘッダファイル保護子を定義します.
ヘッダファイルの保護子とは?
次の内容を見ればわかるでしょう
ヘッダファイルを作成する前に、追加のプリプロセッサ施設を導入する必要があります.プリプロセッサでは、変数をカスタマイズできます.名前の競合を避けるために、プリプロセッサ変数は常に大文字で表されます.前処理変数には、定義済みまたは未定義の2つのステータスがあります.
  
  #ifndef BEGEIN_H

   #define BEGEIN_H

   //           
   #endif

2つのヘッダファイル定義と同じプリプロセッサ変数が使用されていない場合は、問題ありません.このような場合は、ヘッダファイルに定義されたエンティティクラスを使用してプリプロセッサ変数を命名し、プリプロセッサ変数の重複問題を回避できます.
#include<>と#include""の違いヘッダファイル名が<>の場合、標準ヘッダファイルとみなされます.コンパイラは、定義された場所でヘッダファイルを検索します.「」の場合は、非システムヘッダファイルとみなされます.非システムファイル検索は、通常、ソースファイルのパスから開始されます.