両方の意味は私にはわかりません。
ベストアンサー1
宣言は識別子を導入し、その型 (型、オブジェクト、関数など) を記述します。宣言は、コンパイラがその識別子への参照を受け入れるために必要なものです。宣言には次のものがあります。
extern int bar;
extern int g(int, int);
double f(int, double); // extern can be omitted for function declarations
class foo; // no extern allowed for type declarations
定義は実際にこの識別子をインスタンス化/実装します。これは、リンカーがそれらのエンティティへの参照をリンクするために必要なものです。これらは、上記の宣言に対応する定義です。
int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};
定義は宣言の代わりに使用できます。
識別子は必要なだけ宣言できます。したがって、C および C++ では次の宣言は有効です。
double f(int, double);
double f(int, double);
extern double f(int, double); // the same as the two above
extern double f(int, double);
ただし、定義は1 回だけ行う必要があります。どこかで宣言され参照されているものの定義を忘れると、リンカーは参照をリンクする先がわからなくなり、シンボルが不足しているとエラーを出力します。何かを複数回定義すると、リンカーは参照をリンクする先がわからなくなり、シンボルが重複しているとエラーを出力します。
C++ におけるクラス宣言とクラス定義の違いについての議論が (他の質問への回答やコメントで) 頻繁に起こるので、ここでは C++ 標準からの引用を貼り付けます。3.1
/2 で、C++03 は次のように述べています。
宣言は、クラス名宣言でない限り、定義です。
3.1/3 では、いくつかの例を示します。その中には次のようなものがあります。
[例: [...] struct S { int a; int b; }; // S、S::a、および S::b を定義します [...] struct S; // Sを宣言する —例終了
要約すると、C++ 標準では、 は宣言と定義であるとstruct x;
見なされます。(言い換えると、C++ にはクラス宣言の他の形式がないため、「前方宣言」は誤った名称です。)struct x {};
感謝litb (ヨハネス・シャウブ)彼は答えの一つの中で実際の章と節を掘り出しました。