コンピュータプログラミングにおいて、構文言語構造における宣言とは、初期化のための識別子のプロパティを指定するプロセスであり、単語(識別子)の意味を宣言するものです。[ 1 ]宣言は、関数、変数、定数、クラスに最も一般的に使用されますが、列挙や型定義などの他のエンティティにも使用できます。 [ 1 ]名前(識別子自体)とエンティティの種類(関数、変数など)に加えて、宣言は通常、データ型(変数と定数の場合)または型シグネチャ(関数の場合)を指定します。型には、配列などの次元も含まれる場合があります。宣言は、コンパイラにエンティティの存在を知らせるために使用されます。これは、関数、変数、定数、およびそれらの型を、使用前に宣言で指定する必要がある厳密な型付け言語では重要であり、前方宣言で使用されます。[ 2 ]「宣言」という用語は、「定義」という用語とよく対比されますが、[ 1 ]意味と使用法は言語によって大きく異なります。以下を参照してください。
宣言は、 BCPLファミリー(特にCとC++)やPascalなど、 ALGOL系の言語で特に顕著に見られます。Javaも「宣言」という用語を使用しますが、Javaでは宣言と定義を別々にする必要はありません。
基本的な二分法の一つは、宣言に定義が含まれているかどうかです。例えば、変数や定数の宣言がその値を指定するのか、それとも型だけを指定するのか、また同様に、関数の宣言が関数の本体(実装)を指定するのか、それとも型シグネチャだけを指定するのか、といったことです。 [ 1 ]すべての言語がこの区別をしているわけではありません。多くの言語では、宣言には常に定義が含まれており、言語によっては「宣言」または「定義」と呼ばれることがあります。[ a ]ただし、使用前に宣言が必要な言語(前方宣言が使用される)や、インターフェースと実装が分離されている言語では、これらの概念は区別されます。インターフェースには宣言が含まれ、実装には定義が含まれます。[ b ]
非公式な用法では、「宣言」は純粋な宣言(型のみで、値や本体は含まない)のみを指し、「定義」は値や本体を含む宣言を指します。しかし、正式な用法(言語仕様)では、「宣言」はこれら両方の意味を含み、言語によってより細かい区別があります。C と C++ では、本体を含まない関数の宣言は関数プロトタイプと呼ばれ、本体を含む関数の宣言は「関数定義」と呼ばれます。Java では、宣言は 2 つの形式で存在します。パブリック メソッドの場合、メソッド名、入力型、出力型で構成されるメソッド シグネチャとしてインターフェースで表現できます。定義を含まない抽象メソッドの定義でも同様の表記法を使用できます。囲んでいるクラスをインスタンス化できますが、クラスのインスタンスを作成するには、メソッドの定義を提供する新しい派生クラスを作成する必要があります。Java 8以降、関数宣言と見なせるラムダ式が言語に含まれました。
C言語系のプログラミング言語では、宣言はヘッダーファイルにまとめられることが多く、これらの宣言を参照・使用する他のソースファイルにインクルードされますが、定義自体にはアクセスできません。ヘッダーファイルの情報は、宣言を使用するコードと宣言を定義するコードとの間のインターフェースを提供し、一種の情報隠蔽を実現します。宣言は、異なるソースファイルやライブラリで定義された関数や変数にアクセスするためによく使用されます。定義型と宣言型が一致しない場合は、コンパイラエラーが発生します。
変数の場合、定義によって宣言フェーズで確保されたメモリ領域に値が割り当てられます。関数の場合、定義によって関数本体が提供されます。変数や関数は複数回宣言できますが、通常は一度だけ定義されます(C++では、これは単一定義ルール(ODR)として知られています)。
JavaScriptやPythonのような動的言語では、一般的に関数を再定義、つまり再バインドすることができます。関数は他の変数と同様に、名前と値(定義)を持つ変数です。
以下は、C言語における定義ではない宣言の例です。
extern char example1 ; extern int example2 ; void example3 ( void );以下は、C言語における定義である宣言の例です。
char example1 ; /* 関数定義の外では、ゼロに初期化されます。 */ int example2 = 5 ; void example3 ( void ) { /* 中括弧内の定義 */ }一部のプログラミング言語では、コンパイル時にそのような変数が初めて見つかったときに暗黙の宣言が行われます。他の言語では、そのような使用はエラーとみなされ、診断メッセージが表示される場合があります。一部の言語は当初、暗黙の宣言動作を採用していましたが、成熟するにつれてそれを無効にするオプションを提供するようになりました(たとえば、Perlのuse strict" やVisual Basicの " などOption Explicit)。
[宣言は[...]何かの名前と型を導入するだけで、ストレージを割り当てません[...]。