重複の可能性:
定義と宣言の違いは何ですか?
変数に関するこれら 2 つの用語について、私は非常に混乱しています。同じように見える本もあれば、まったく違う本もあります。変数または関数の宣言の意味と、変数または関数の定義の意味を教えてください。
重複の可能性:
定義と宣言の違いは何ですか?
変数に関するこれら 2 つの用語について、私は非常に混乱しています。同じように見える本もあれば、まったく違う本もあります。変数または関数の宣言の意味と、変数または関数の定義の意味を教えてください。
宣言は、たとえば、変数「x」が存在することをマシンに伝えるようなものです。何かに設定することもできます。
変数を定義することは、変数を何かに設定することです。
(間違っているかもしれません、これは私の考え方です)
宣言はコンパイラに何かが存在することを伝えますが、必ずしもそのコードや値を提供するとは限りません。たとえば、関数を宣言する場合:
void foo();
関数の実際のコードがまだ提供されていなくても、関数の呼び出しを適切にコンパイルできるように、関数の名前、その引数 (この場合はなし)、および戻り値の型をコンパイラに伝えます。プログラムの別の場所 (おそらく別のソース ファイル) で、定義を提供します。
void foo() {
std::cout << "Hello, world!" << std::endl;
}
定義しているものがまだ宣言されていない場合、定義は宣言としても機能します。
一般に、定義をソース ファイルに入れ、宣言をヘッダー ファイルに入れることで、定義を含むソース ファイル以外のソース ファイルから "見える" ようにします。ただし、C++ でクラスを作成すると、次のようになります。
class Blah {
public:
void blah();
private:
int x;
};
これは、メンバーの宣言を含むクラスの定義です。クラス定義は通常、ヘッダー ファイルに入れますが、メンバー関数の定義は通常は入れません (テンプレートとインライン関数を除く)。
コンパイルとリンクがどのように機能するかについて、この回答を読むと参考になるかもしれません。