問題は、制約のシリーズに由来:
- 値のセマンティクスがそれをコンパイルする必要がありますが、パラメータを知っているし、種類のサイズを返す必要があります「と呼んで」。
- コンパイル時に同じ翻訳単位をコンパイルするときに、その知識が利用できる必要がありますが、...
- 定義から来る知識は、コンパイル時に別のステップであるリンク時にのみ使用できます。
によってより、C++の文法変更の意味を複雑にするには、シンボルを変数や型(そう、この知識がなくても、a<b>c
であれば、それが何を意味するのかを知ることさえ不可能です:変数3を含む式かの変数の宣言テンプレートインスタンスによって与えられた型)。
関数定義は別のソースファイルに存在する可能性があり、コンパイラは最初のコンパイル時にアクセスする方法がないため、パラメータと戻り値のスタックにどのくらいの幅を置くべきかを知る必要があります。
//test.cpp
#include "test.h" //required to check decl & def consistence
double test()
{ /*...*/ }
//main.cpp
#include "test.h" // required to know about test() parameters and return
int main()
{
double z = test(); //how does "=" translate? we need to know what test returns
}
この "プロジェクト" __独立した手順を使用してコンパイルされるコードとして
//test.h
double test();
__
幅広いプロジェクト - -inあなたのサンプルは次のようになります。
g++ -c main.cpp //on a program developer machine
g++ -c test.cpp //on a library developer machine
g++ main.o test.o -o yourprogram //on a "package distributor" machine
これらのステップのいずれも、同時にすべての「グローバルシンボル」とその「翻訳」について「グローバルな知識」を集めることはできません。私たちは、すべて同じクラスの括弧の中にとどまることを要求され、メンバ関数は、この問題を持っていないか注意してください、そして結果としてある(それらを
を使用する必要が誰に宣言をブロードキャストするヘッダを必要とする理由です
モジュールは(どのように書き込まれ、ロードされているかに関係なく)すべて同じ言語マシンインスタンスによってロードされるため、JavaやPythonなどの言語にはこの問題はありません。実際にすべてのシンボルと関連するタイプを収集することができます。
Dのような言語(「別々のコンパイル」の意味ではC++に似ています)は、同じモジュールに存在するものの間の順序の独立性を可能にしますが、最初にシンボルとタイプを収集して通話の変換を行い、2段階の翻訳を行います。
あなたははい、私は意図は、コンパイルをスピードアップするためだったと思う。この問題here
の別の説明を見ることができます。 – alain
関数を宣言するだけで関数を宣言することができます。定義する必要はありません。 – SergeyA
@ SergeyA私はそれを知っています。しかしそれは問題ではない。 – Midnightas