includeディレクティブは、テキスト ファイル プロセッサに、ディレクティブ テキストを指定されたファイルの内容に置き換えるように 指示します。
インクルードの動作は本質的に論理的である可能性があります。プロセッサは、結合されたファイルを作成せずに、ディレクティブの場所にあるインクルード ファイルの内容を単純に処理する場合があります。
プロセッサによって構文が異なる場合があります。Cプリプロセッサ( C、C++およびその他のコンテキストで使用される) は、#includeファイル指定で始まり、その後に続く行として include ディレクティブを定義します。COBOLは、コピーブックcopyをインクルードするために、 で示される include ディレクティブを定義します。
一般的に、C/C++ の場合、 include ディレクティブはヘッダー ファイルをインクルードするために使用されますが、任意のファイルをインクルードできます。比較的まれですが、 .c ファイルなどの 本体ファイルをインクルードするために使用されることもあります。
include ディレクティブは、カプセル化と再利用をサポートできます。システムのさまざまな部分を論理グループに分離しながら、ファイルのインクルードを介して相互に依存できます。C と C++ は、実装とは別に宣言を許可することでビルド時間も最適化しながら、include を活用するように設計されています。インクルードされる情報は、宣言のみに最小限に抑えることができます。
ファイル コンテンツをインクルードすることには大きな欠点があると多くの人が考えているため、新しい言語は include ディレクティブなしで設計されています。JavaやC#などの言語は、テキストをインクルードするのではなく、モジュールが概念レベルで別のモジュールのアセットを使用できるようにするインポートコンセプトを介してモジュール化をサポートしています。
言語サポート
C++ の
#includeC と C++ はどちらも、通常、ディレクティブ行を指定されたファイルの内容に置き換える C プリプロセッサで使用されます。ファイル パスは、二重引用符 ("xyz.h" など) または山括弧 (<xyz.h> など) で囲まれます。 [1]一部のプリプロセッサは、囲み区切り文字に基づいてインクルード ファイルの位置を異なる方法で指定します。二重引用符で囲まれたパスはインクルード ファイルに対する相対パスとして扱い、山括弧で囲まれたパスは、構成されたシステム検索パスのディレクトリの 1 つにあるパスとして扱います。[2]
include ステートメントの例:
// C 標準ヘッダー 'stdio.h' をインクルードします。おそらくその名前のファイルです
#include <stdio.h> // C++ 標準ヘッダー 'vector' をインクルードします。ファイルである場合もそうでない場合もあります#include <vector> // 'user_defined.h' という名前のカスタム ヘッダー ファイルをインクルードします#include "user_defined.h"
include ディレクティブを使用すると、次のようなコードライブラリの開発が可能になります。
- プログラム全体で全員が同じバージョンのデータレイアウト定義または手続き型コードを使用するようにする
- システム内でコンポーネントが使用されている場所を簡単に相互参照できる
- 必要に応じてプログラムを簡単に変更できます(編集する必要があるファイルは 1 つだけです)
- データレイアウトを再利用して時間を節約
例
2 つの C ソース ファイルがあるとします。1 つは関数を定義しadd()、もう 1 つはその関数を使用します。include ディレクティブを使用せずに、使用するファイルは関数を関数プロトタイプとしてローカルに宣言できます。
int add ( int , int ); int triple ( int x ) { return add ( x , add ( x , x ) ); }
この方法の欠点の 1 つは、 を呼び出す各ファイルに関数プロトタイプが存在する必要があることですadd()。もう 1 つの欠点は、シグネチャが変更された場合、各消費ファイルを更新する必要があることです。プロトタイプを 1 つの別のファイルに配置すると、これらの問題を回避できます。プロトタイプをヘッダー ファイルに移動するとadd.h、使用するソース ファイルは次のようになります。
#include "add.h" int triple ( int x ) { return add ( x , add ( x , x )); }
ヘッダーファイル
C および C++ では、ヘッダー ファイルは、プログラマーがコードベースの要素を、多くの場合は再利用可能で論理的に関連するグループに分離できるようにするソース コードファイルです。
ヘッダーファイルは、関数、クラス、変数、プリプロセッサマクロなどのプログラミング要素を宣言します。ヘッダーファイルを使用すると、プログラマはヘッダーファイル内の共通の宣言に基づいて、複数の本体ファイルでプログラミング要素を使用できます。ヘッダーファイル内の宣言により、本体ファイルは実装コードを直接含めずに実装を使用できます。ヘッダーは、インターフェイスを実装から分離します。[3]
複数のヘッダーファイルに同じファイルが含まれていると、コンパイルエラーが発生する可能性があります。解決策の1つは、ヘッダーファイルにファイルをインクルードしないようにすることです。これにより、本体ファイルに過剰なインクルードディレクティブが必要になる可能性があります。もう1つの解決策は、各ヘッダーファイルにインクルードガードを使用することです。 [4]
C標準ライブラリは、ヘッダー ファイルのコレクションとして宣言されます。C ++ 標準ライブラリも同様ですが、実際のファイルを読み取らずにコンパイラによって宣言が提供される場合があります。
C 標準ヘッダー ファイルの名前は、 のように.h ファイル名拡張子で付けられます。通常、カスタム C ヘッダー ファイルも同じ拡張子を持ちます。カスタム C++ ヘッダー ファイルには、 、など#include <stdio.h>、より多様な拡張子が付けられる傾向があります。
.hpp.h++.hh
ヘッダ
山括弧で囲まれたC++標準ライブラリ名(つまり<vector>)は宣言が含まれることになりますが、ファイルからのものではない可能性があります。[5]
ヘッダーユニット
C++20以降、C++はヘッダーユニット、つまりヘッダーから合成された個別の翻訳単位を介したインポートセマンティクスをサポートしています。 [6]これらはモジュールと一緒に使用することを目的としています。その場合に使用される構文は次のとおりです。
エクスポートオプションインポート ヘッダー名;
例:
import < stdio . h > ; // これをサポートするのはオプションですimport < vector > ; // これをサポートするのは標準で必須ですexport import "user_defined.h" ;
すべてのC++標準ライブラリヘッダーにはヘッダーユニットが提供されています。[7]
コボル
COBOL(およびRPG IV)では、プログラマーがコピーブックをプログラムのソースにコピーすることができます。これはインクルードに似ていますが、テキストを置き換えることができます。インクルードのCOBOLキーワードは でありCOPY、置換は 句を使用して行われます。インクルード指令はCOBOL 60以来COBOLに存在していましたが、 1968年までにREPLACING ... BY ...元のINCLUDE[8]からに変更されました。 [9]COPY
フォートラン
Fortran には、本来ヘッダー ファイルは必要ありません。ただし、Fortran 90 以降には、includeステートメントとモジュールという 2 つの関連機能があります。ステートメントは、C ヘッダーのように、プロシージャ インターフェイスを含む共通ファイルを共有するために使用できますが、インターフェイスの指定はすべての種類の Fortran プロシージャで必要なわけではありません。このアプローチは一般的には使用されません。代わりに、プロシージャは通常、use他のコード領域内のステートメントで参照できるモジュールにグループ化されます。モジュールの場合、ヘッダー タイプのインターフェイス情報はコンパイラによって自動的に生成され、通常は別のモジュール ファイルに配置されますが、一部のコンパイラでは、この情報がオブジェクト ファイルに直接配置されています。モジュール プロシージャ インターフェイスはほぼ普遍的にこの方法で伝播されますが、言語仕様自体は追加ファイルの作成を義務付けていません。
パスカル
ほとんどのPascalコンパイラは、$iまたは$includeコンパイラディレクティブをサポートしています。このディレクティブでは、$iまたは$includeディレクティブは、次の形式でコメントブロックの開始直後に続きます。
{$i filename.pas}(*$I filename.inc*){$include filename.inc}(*INCLUDE filename.pas*)
ここで、$iまたはディレクティブは大文字と小文字を区別$includeせず、filename.pasまたはfilename.inc はインクルードするファイルの名前です。(Pascal のインクルード ファイルに拡張子.incを付けるのが一般的な慣例ですが、これは必須ではありません。) 一部のコンパイラでは、無制限の再帰を防ぐために、インクルード ファイルの呼び出しを特定の数に制限したり、それ自体または現在開いているファイルの呼び出しを禁止したり、一度に最大 1 つのインクルード ファイルに制限したりします。たとえば、インクルード ファイルはそれ自体または別のファイルをインクルードできません。ただし、他のファイルをインクルードするプログラムでは、一度に 1 つだけ、複数のファイルをインクルードできます。
PHP の
PHPでは、includeディレクティブにより別のPHPファイルがインクルードされ評価されます。[10]同様のコマンドには がありrequire、インクルードに失敗すると致命的な例外を生成してスクリプトを停止します。[11]およびinclude_onceと はrequire_once、すでにインクルードまたは要求されているファイルが再度インクルードまたは要求されることを防ぎ、Cの二重インクルード問題を回避します。
その他の言語
include ディレクティブを持つその他の注目すべき言語:
include ...( Fortran、MASM )<!--#include ... -->(HTML SSI )var ... = require("...")( CommonJSを使用した JavaScript )<%@ include ... %>(JSP){$I ...}( UCSD パスカル、ターボパスカル)%include ...(ポーランド語)/COPY QCPYLESRC,QBC(RPG IV – 最初の引数はファイル名、2 番目の引数はコピーブック)local ... = require("...")(ルア)import ...;(デ)
最近の言語 ( HaskellやJavaなど) は、 include ディレクティブ構造を避け、モジュールとインポート/エクスポートのセマンティクスを好む傾向があります。これらの言語の一部 (Java やC#など) は前方宣言を使用せず、代わりに識別子はソース ファイルから自動的に認識され、動的ライブラリシンボル (通常はimportまたはusingディレクティブで参照) から直接読み取られます。
参照
- アプリケーションプログラミングインターフェース – コンピュータまたはプログラム間の接続
- クラス実装ファイル – 対応するヘッダーファイルで宣言されたメソッドを実装するソースコードを含むファイル
- ヘッダーのみ – ヘッダーファイルで完全に定義された C または C++ ライブラリ
- インターフェース定義言語 – ソフトウェアコンポーネントのインターフェースを記述するために使用されるコンピュータ言語
- ファイルインクルード脆弱性 – Web脆弱性の種類
- モジュラープログラミング – ソフトウェア設計手法
- 1つの定義ルール – プログラミング言語 C++ のルール
- #pragma once – C および C++ のプリプロセッサ ディレクティブ
- プリコンパイル済みヘッダー – コンピュータプログラミングにおける最適化されたファイルの種類
- トランスクルージョン – あるデータセットを別のデータセットに自動的に含める
- Unity ビルド – C/C++ プロジェクトのビルドを高速化するテクニック
参考文献
- ^ C11 標準、6.10.2 ソースファイルのインクルード、pp. 164–165
- ^ Stallman, Richard M. (1992 年 7 月). 「C プリプロセッサ」(PDF)。2012 年 9 月 4 日時点のオリジナル(PDF)からアーカイブ。2014 年2 月 19 日閲覧。
- ^ Alan Griffiths (2005). 「C++ におけるインターフェースと実装の分離」. ACCU . 2013 年 5 月 7 日閲覧。
- ^ Pike, Rob (1989年2月21日)、「Notes on programming in C」、Cat-v 文書アーカイブ、 2011年12月9日閲覧
- ^ C11 標準、7.1.2 標準ヘッダー、p. 181、脚注 182: 「ヘッダーは必ずしもソース ファイルである必要はなく、ヘッダー名内の と で区切られたシーケンス
<も>必ずしも有効なソース ファイル名であるとは限りません。 - ^ 「モジュールのマージ - P1103R3」(PDF)。
- ^ 「P1502R1 - C++20 の標準ライブラリ ヘッダー ユニット」。
- ^ 「COBOL 共通ビジネス指向言語の初期仕様」(PDF)。国防総省。1960 年 4 月。p. IX-9。2014年 2 月 12 日時点のオリジナル(PDF)からアーカイブ。2014 年2 月 11 日に閲覧。
- ^ 「COPY ステートメント」。CODASYL COBOL Journal of Development 1968。1969 年 7 月。LCCN 73601243 。
- ^ "include". php.net . PHP グループ. 2014 年2 月 20 日閲覧。
- ^ "require". php.net . PHP グループ. 2014 年2 月 20 日閲覧。
外部リンク
- コード ファイルの整理 (C++ でヘッダー ファイルを使用する際の潜在的な落とし穴とガイドライン)
- C++ ヘッダーファイルのインクルード規則
