1. ホーム
  2. c

[解決済み】定義と宣言の違いは何ですか?

2022-03-23 08:30:52

質問

どちらの意味もよくわからない。

どのように解決するのか?

A 宣言 は、識別子を導入し、その型(型、オブジェクト、関数)を記述します。宣言は コンパイラが必要とするもの を使用して、その識別子への参照を受け付けます。これらは宣言である。

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

A 定義 は、実際にこの識別子をインスタンス化/実装しています。それは リンカが必要とするもの は、これらの実体への参照をリンクするために、その実体への参照をリンクします。これらは、上記の宣言に対応する定義である。

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);

ただし、必ず 定義済み は一度だけです。もし、どこかで宣言され参照されているものを定義し忘れると、リンカは何を参照すればいいのかわからなくなり、シンボルの欠落を訴えることになります。もし、何かを複数回定義すると、リンカは どの を参照する必要があり、シンボルが重複していると文句を言われます。


クラスとは何かという議論から 宣言 vs. クラス 定義 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; になります。 宣言 struct x {}; a 定義 . (言い換えれば 前方宣言は誤用です。 C++では他にクラス宣言の形式がないため)。

ありがとうございました litb (Johannes Schaub) の回答で、実際の章と節を掘り出してくれました。