多くのプログラミング言語やその他のコンピュータファイルには、、、またはと呼ばれるディレクティブがあり、指定されたファイルの内容を元のファイルに挿入します。これらのインクルードファイルは、includeimportcopyヘッダー ファイルまたはコピーブック前方宣言の物理レイアウトを定義し、カプセル化促進するために。
ヘッダーファイル
コンピュータプログラミングにおいて、ヘッダーファイルとは、プログラマがプログラムのソースコードの特定の要素を再利用可能なファイルに分割できるようにするファイルです。ヘッダーファイルには、通常、クラス、サブルーチン、変数、およびその他の識別子の前方宣言が含まれます。複数のソースファイルで標準化された識別子を宣言したいプログラマは、そのような識別子を単一のヘッダーファイルに配置することができます。これにより、ヘッダーの内容が必要なときはいつでも、他のコードでそのヘッダーファイルをインクルードできます。これは、ヘッダー内のインターフェイスを実装から分離するためです。[1]
C標準ライブラリとC++ 標準ライブラリは、従来、標準関数をヘッダー ファイルで宣言します。
一部の新しいコンパイル言語 ( JavaやC#など) では、前方宣言は使用されません。識別子はソース ファイルから自動的に認識され、動的ライブラリシンボルから直接読み取られます。つまり、ヘッダー ファイルは必要ありません。
目的
このinclude指令により、次のことに役立つコードライブラリの開発が可能になります。
- プログラム全体で全員が同じバージョンのデータレイアウト定義または手続き型コードを使用するようにする。
- システム内でコンポーネントが使用されている場所を簡単に相互参照できる
- 必要に応じてプログラムを簡単に変更できる(編集する必要があるファイルは1つだけ)
- データ レイアウトを再利用することで時間を節約します。
例
include ディレクティブの使用が有効な例として、別のファイル内の関数を参照する場合が挙げられます。関数 を含むCソース ファイルがあるとします。この関数 は、まず次のように外部存在と型 (関数プロトタイプを使用)
addを宣言して 2 番目のファイルで参照されます。
intを追加します( int 、int );
intトリプル( int x ) {戻り値 add ( x , add ( x , x ) ); }
この方法の欠点の 1 つは、関数プロトタイプが、関数を使用するすべてのファイルに存在しなければならないことです。もう 1 つの欠点は、関数の戻り値の型または引数が変更された場合、これらすべてのプロトタイプを更新する必要があることです。プロトタイプを 1 つの別のファイルに配置すると、これらの問題を回避できます。プロトタイプがファイル に移動されると仮定するとadd.h、2 番目のソース ファイルは次のようになります。
#include "add.h"
intトリプル( int x ) {戻り値 add ( x , add ( x , x ) ); }
これで、コードがコンパイルされるたびに、最新の関数プロトタイプがadd.hそれらを使用するファイルに含まれ、潜在的なエラーを回避できるようになります。
言語サポート
C++ の
CおよびC++プログラミング言語では、#include プリプロセッサ ディレクティブにより、コンパイラは、その行を、指定されたソース ファイル (引用符で囲まれている場合: "") または指定されたヘッダー (山括弧で囲まれている場合: <>) の内容のテキスト全体に置き換えます。[2]ヘッダーはソース ファイルである必要はありません。[3]インクルードは、実装定義のネスト制限まで、これらのインクルードされた内容に対して再帰的に続行されます。ヘッダーには、ファイルに対応する名前が付いている必要はありません。C++ 標準のヘッダーは通常、「vector」などの単語で識別されるため、 となりますが、#include <vector>C 標準のヘッダーは、 のように、ファイル名に「.h」拡張子が付いた形式で識別子が付いています#include <stdio.h>。 「ソース ファイル」は、任意の形式の名前を持つ任意のファイルですが、最も一般的には「.h」拡張子が付けられ、「ヘッダー ファイル」と呼ばれます (C++ ヘッダーを区別するために「.hpp」または「.hh」と呼ばれることもあります)。ただし、.c、.cc、および .cpp 拡張子を持つファイルも含まれる場合があり (特に単一コンパイル ユニット手法の場合)、他の拡張子が使用されることもあります。
これらの 2 つの形式の#includeディレクティブは、実装定義の方法で、どのヘッダーまたはソース ファイルをインクルードするかを決定できます。実際には、通常、山括弧形式は標準システム ディレクトリ (またはディレクトリ セット) でソース ファイルを検索し、次にローカルまたはプロジェクト固有のパス (コマンド ライン、環境変数、またはMakefileまたはその他のビルドファイルで指定) でソース ファイルを検索します。一方、引用符付きの形式では、標準システム ディレクトリは検索されず、ローカルまたはプロジェクト固有のパスのみを検索します。[4]衝突がない場合は、山括弧形式を使用してプロジェクト固有のインクルードを指定することもできますが、これは不適切な形式と見なされます。ヘッダーがファイルに対応する必要がないという事実は、主に実装の技術的な問題であり、C++ 標準ヘッダーをインクルードするときに .h 拡張子を省略するために使用されます。一般的に、「ヘッダー」は「ヘッダー ファイル」を意味します。
例えば:
#include <stdio.h> // 標準ヘッダー 'stdio.h' (おそらくファイル 'stdio.h') の内容をインクルードします。#include <vector> // 標準ヘッダー 'vector' (おそらくファイル 'vector.h') の内容をインクルードします。#include "user_defined.h" // ファイル 'user_defined.h' の内容をインクルードします。
C および C++ では、2 つ (またはそれ以上) のインクルード ファイルに同じ 3 番目のファイルが含まれていると問題が発生する場合があります。1 つの解決策は、インクルード ファイルに他のファイルをインクルードしないようにすることです。この場合、プログラマーが元のファイルに手動で追加のインクルード ディレクティブを追加する必要がある可能性があります。もう 1 つの解決策は、インクルード ガードを使用することです。[5]
C++20以降、ヘッダーはヘッダーユニット、つまりヘッダーから合成された別の翻訳単位としてインポートすることもできる。 [6]これらはモジュールと一緒に使用されることを意図している。その場合に使用される構文は次の通りである。
エクスポートオプションインポート ヘッダー名;
例えば:
import < stdio . h > ; // これをサポートするのはオプションですimport < vector > ; // これをサポートするのは標準で必須ですexport import "user_defined.h" ;
すべてのC++標準ライブラリヘッダーにはヘッダーユニットが提供されています。[7]
コボル
COBOL(およびRPG IV)では、ヘッダーファイルと同様の方法でコピーブックをプログラムのソースにコピーできますが、コピーブック内の特定のテキストを他のテキストに置き換えることもできます。COBOLのインクルードのキーワードは でCOPY、置き換えは 節を使用して行いますREPLACING ... BY ...。COBOLにはCOBOL 60以降、includeディレクティブが存在していましたが、1968年までに元の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 )import ...;(ジャワ)import ... from ...( ECMAScriptのJavaScript )var ... = require("...")( CommonJSを使用した JavaScript )<%@ include ... %>(JSP){$I ...}( UCSD パスカル、ターボパスカル)%include ...(ポーランド語)import ...(パイソン)/COPY QCPYLESRC,QBC(RPG IV – 最初の引数はファイル名、2 番目の引数はコピーブック)use ...;(さび)using ...;( C# ) で始まるlocal ... = require("...")(ルア)import ...;(デ)
最近の言語 ( HaskellやJavaなど) では、コピーブックやインクルードを避け、名前空間の制御にモジュールやインポート/エクスポート システムを使用する傾向があります。これらの言語の一部 (Java やC#など) では、前方宣言は使用されず、代わりに識別子がソース ファイルから自動的に認識され、動的ライブラリシンボル (通常はまたはディレクティブで参照)から直接読み取られるため、ヘッダー ファイルは必要ありません。
importusing
参照
- アプリケーション プログラミング インターフェイス(API)
- プリコンパイル済みヘッダー
- サブルーチン
- モジュールプログラミング
- #プラグマワンス
- ヘッダーのみ
- ユニティビルド
- トランスクルージョン
- ファイルインクルードの脆弱性
- 1 つの定義ルール(ODR)
- インターフェース定義言語(IDL)
- クラス実装ファイル
参考文献
- ^ Alan Griffiths (2005). 「C++ におけるインターフェースと実装の分離」. ACCU . 2013 年 5 月 7 日閲覧。
- ^ C11 標準、6.10.2 ソースファイルのインクルード、pp. 164–165
- ^ C11 標準、7.1.2 標準ヘッダー、p. 181、脚注 182: 「ヘッダーは必ずしもソース ファイルである必要はなく、ヘッダー名内の と で区切られたシーケンス
<も>必ずしも有効なソース ファイル名であるとは限りません。 - ^ Stallman, Richard M. (1992 年 7 月). 「C プリプロセッサ」(PDF)。2012 年 9 月 4 日時点のオリジナル(PDF)からアーカイブ。2014 年2 月 19 日閲覧。
- ^ Pike, Rob (1989年2月21日)、「Notes on programming in C」、Cat-v 文書アーカイブ、2011年12月9日閲覧
- ^ 「モジュールのマージ - 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++ ヘッダーファイルのインクルード規則
