2

申し訳ありませんが、私の英語が悪いことは知っていますが、質問がより明確になるように例を挙げました。

a.cpp

#include <iostream>

using namespace std;

void funcfoo(){
    cout << "test only" << endl;
}

int varfoo = 10;



b.cpp

#include <iostream>

using namespace std;

extern void funcfoo();

extern int varfoo;

int main(){

    funcfoo();

    cout << varfoo;

    return 0;
}

次に、この「clb.cppa.cpp」のようにコンパイルします

。私の質問はです。「voidfuncfoo()の前にexternキーワード」を削除すると正常に機能しますが、int var fooの前にexternキーワードを削除すると、エラーが発生します。

4

4 に答える 4

9

問題は、コードの各行が何を意味するかです。int varfooは変数の定義ですが、は宣言void funcfoo()にすぎません。エンティティの複数の宣言を提供できますが、定義は1つだけです。宣言を提供し、変数の宣言のみを提供する構文は、キーワードを追加することによるものです:は宣言ですexternextern int varfoo;


3.1 [basic.def] / 2宣言は、関数の本体(8.4)を指定せずに関数を宣言しない限り、定義であり、extern指定子(7.1.1)またはリンケージ仕様25(7.5)を含み、初期化子も関数本体[...]

于 2012-08-27T17:01:10.973 に答える
3

externあなたがから削除するとき、extern void funcfoo();あなたはそれを前方に宣言しているので、あなたは以下のコードが何でfuncfoo()あるかを知っています。変数に対してこれを行うと、実際にインスタンス化され、他のファイルと競合することになります。したがって、extern「存在します、私を信じてください;)」と言っているので、他のファイルから解決されます。

于 2012-08-27T17:00:43.687 に答える
0

別の見方をすれば、int varfooを実行すると、変数を保持するためにメモリが割り当てられるため、定義と宣言の両方になります。intfoo()を実行すると、関数は宣言されますが、メモリのように定義されません。割り当てられていません。関数の場合、リンケージはデフォルトで外部であるため、削除することは重要ではありませんが、変数の場合、extern int varfooと言うと、コンパイラはそれにメモリを割り当てません。変数は別の場所で定義されていると見なされます。

于 2012-08-31T15:21:24.710 に答える
0

これは遅いかもしれませんが、これが何らかの形で役立つことを願っています。以下のリンクを確認すると、externとは何か、およびそれがどのように機能するかがわかります。

http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/

ありがとうございました

于 2014-02-16T13:13:08.663 に答える