16

「extern」の仕組みを理解するのに苦労しています。私はGoogleを検索しましたが、私が試している特定の例はないようです

one.h を参照する main.cpp ファイルがあり、その中に LIST1 (100 x 100 の double 配列) という名前のリストがある場合、List1[100][100] が double になります。

one.cpp でこのリストを使用するにはどうすればよいですか?

extern double LIST1[100][100]

動かない :/

main.cpp:

#include "one.h"

extern double LIST1[100][100];

one.cpp:

void one::useList()
{
for(j = 0; j < 100; j++)
   {
     for(i = 0; i < 100; i++)
    {
         LIST1[j,i] = 0.5;
    }
 }
}

これは私が持っているものです。

私が得ているエラー:

1>main.obj : エラー LNK2001: 未解決の外部シンボル "double (* LIST1)[100]" (?LIST1@@3PAY0GE@NA)

4

2 に答える 2

31

名前空間スコープでの変数宣言は、それを付けない限り、常に定義ですextern。それはただの宣言です。

C++ の重要なルールは、同じ名前のオブジェクトを複数定義できないことです。ヘッダー ファイルに が含まdouble LIST1[100][100];れているだけの場合、それを 1 つの翻訳単位にのみ含めている限り、これは機能します。しかし、ヘッダー ファイルを複数の翻訳単位に含めるとすぐに、複数のLIST1. あなたはルールを破った !

したがって、複数の翻訳単位からグローバル変数にアクセスできるようにするには、ヘッダー ファイルに宣言のみがあることを確認する必要があります。これを行うにはextern:

extern double LIST1[100][100];

ただし、まだ定義がないため、ヘッダーをインクルードしてこのオブジェクトを使用しようとすることはできません。このLIST1宣言は、このタイプの配列がどこかに存在することを示しているだけですが、実際にはオブジェクトを作成するためにそれを定義する必要があります。したがって、単一の翻訳単位 (.cpp通常はファイルの 1 つ) には、次のように記述する必要があります。

double LIST1[100][100];

これで、各.cppファイルにヘッダー ファイルを含めることができ、宣言のみを取得できます。プログラム全体で複数の宣言を行うことはまったく問題ありません。この定義を持つファイルは1 つだけです。.cpp

于 2013-04-05T19:05:29.903 に答える
22

C++ では、それ以前の C と同様に、各ソース ファイルがオブジェクト ファイルにコンパイルされます。次に、すべてのオブジェクト ファイルがリンクされて、実行可能プログラムが作成されます。

シンボル (関数、グローバル変数) を共有するために、どれがファイルに対してローカルで、どれがプライベートで、どれが他のファイルからインポートされるかをコンパイラに伝えるいくつかのキーワードがあります。

「extern」キーワードは、シンボルにアクセスできるが定義されていないことを意味します。他のモジュールで (グローバルとして) 定義する必要があります。そうでない場合、リンク時に「未定義のシンボル」エラーが発生します。

于 2013-04-05T19:04:57.040 に答える