[解決済み】定義と宣言の違いは何ですか?
質問
どちらの意味もよくわからない。
どのように解決するのか?
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) の回答で、実際の章と節を掘り出してくれました。
関連
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?