6

.h ファイルがあります

test.h

std::list<std::string> RegisterList;

2 つの .c ファイルでこのリストにアクセスしたい

交流

#include "test.h"

RegisterList.push_back(myString);

紀元前

#include "test.h"

RegisterList.push_back(myString2);

このコードをコンパイルすると、エラー ld: fatal: symbol `RegisteredList' is multiple-defined: が表示されます。

何が問題になる可能性がありますか? RegsiterList は test.h でデフォルトで初期化されているため、この問題が発生していますか?

4

4 に答える 4

12

ヘッダー ファイルでオブジェクトを定義し、1 つの定義規則に違反したためです。ヘッダー ファイルでオブジェクトを定義しないでください。

グローバル オブジェクトを使用する場合は、extern として宣言し、1 つのソース ファイルで定義する必要があります。

于 2013-02-14T08:15:56.797 に答える
3

コードはチェーンを通過します: preprocessor-> compiler-> linker. 問題はプリプロセッサに起因しますが、リンカーまで表示されません。

#includeプリプロセッサ ディレクティブです。

ファイルをコンパイルする代わりに.cpp、プリプロセッサはそのファイルから別のファイルを合成し、含まれているファイルを貼り付けます。

次に、コンパイラは合成ファイルをコンパイルして、特にデータ定義を含むオブジェクト ファイルを生成します。

プリプロセッサを2 つの異なるファイル#includeのヘッダー ファイルに誘導.cppすると、同じデータが定義された 2 つの異なるオブジェクト ファイルが生成されます。

ld: fatal: symbol 'RegisteredList' is multiply-defined

このエラー メッセージは、リンカー ( ld) が、グローバル シンボルが複数回定義されており、どれを使用すればよいかわからないことを訴えています。

于 2013-02-14T08:52:50.123 に答える
3

次のようなものが必要です:

test.h

extern std::list<std::string> RegisterList;

交流

#include "test.h"

RegisterList.push_back(myString);

紀元前

#include "test.h"

std::list<std::string> RegisterList;

RegisterList.push_back(myString2);
于 2013-02-14T08:17:53.023 に答える
2

ヘッダー ファイルで変数をインスタンス化しないでください。常にコード ファイルでインスタンス化し、ヘッダー ファイルでインスタンス化を参照します。

于 2013-02-14T08:15:42.857 に答える