前方宣言プログラミングにおいて、前方宣言(ぜんぽうせんげん、英: forward declaration)とはプログラマが完全な定義を与えていないプログラム要素を表すシンボルの事前宣言のことである。変数、関数、型などに対するシンボルが含まれる。 概要C言語の例を示す。 int elements[]; /* int型の配列変数の前方宣言 */
void foo(int); /* int型の引数を受け取る関数の前方宣言 */
struct user_type; /* 構造体の前方宣言 */
関数の前方宣言はまた関数プロトタイプでもある。コンパイラはソースコード中に出現したこれらの宣言を処理した後、プログラマに以降の部分で int elements[10];
void foo(int x) { printf("%d\n", x); }
struct user_type { int a; double t; };
大抵のケースでは、実体の定義の順序を工夫することで、前方宣言をせずともプログラムを記述することはできるが、循環参照を解決したり、自己参照構造体を定義したり、ソースコードの解析回数を減らして効率よくプログラムをコンパイルしたりするために前方宣言が用いられる。特に前方宣言をインターフェイスとしてヘッダーファイルに分離し、実体をソースファイルに記述することで、個々のプログラム部品の実装を隠蔽して独立性を高めることができるようになる。 Pascalや他のヴィルトの言語では、前方宣言は使う前にすべての実体を宣言しなければならないという一般的規則である。C言語でも同じ一般的規則が適用されるが、未宣言の関数のための例外がある。その結果、C言語では(賢明ではないが)相互再帰の関数ペアを実行することが可能である: int first(int x)
{
if (x == 0) return 1;
return second(x-1);
}
int second(int x)
{
if (x == 0) return 0;
return first(x-1);
}
Pascalで同様の実装をする場合、 C++では構造体 ( 前方参照前方参照 (英: forward reference) という用語は時々前方宣言の類義語として使われている。[1] しかしながらこの用語はその定義よりもむしろ、宣言する前に実体を実際に「利用」することを言及するのに使われている。この定義は上記のコードにおける C++での(正しい)前方参照の例: class SomeClass {
public:
void setValue(int v) { myValue = v; }
int getValue() const { return myValue; }
private:
int myValue;
};
例えば、 前方参照を可能にすると、コンパイラの複雑さやメモリの必要量が激しく増し、一般的にはコンパイラのワンパスでの実行を難しくする。 |