-1

私はあまり慣れておらず、c++ でのグローバル変数の使用をよく理解していません。ここで問題を解決することはできませんが、宣言を正しい方法で使用しているとほぼ確信しています。ファイルのパラメーターを含む順序付けられていないマップがあります。これは正常に機能しています。コンテンツを出力しました。すべて問題ありません。しかし、このマップをプログラムのどこでも使用できるようにして、毎回引数として渡す必要がないようにしたいので、グローバル変数を使用します。私は少し typedef を持っています:

typedef tr1::unordered_map<string,float> unmap;

次に、パラメータを読み取る関数:

unmap readParameters(string filename);

次に、グローバル スコープの宣言 (もちろん、メイン以外のすべて。ただし、同じファイル内にありますが、まだヘッダーはありません):

extern unmap params;

影響は main() 関数で行われます。

unmap params=readParameters(inputfile_name);

(注:「マップ解除」の有無にかかわらず試しましたが、同じエラーです)。そして、マップ「params」を使用する内容を表示する関数 displayInformation() があります。

for (unmap::iterator it=params.begin();it!=params.end();it++){
    cout<<it->first<<" = "<<it->second<<endl;
}

しかし、g ++はうめき声を上げます:

    Undefined symbols for architecture x86_64:
  "_params", referenced from:
      _main in loca.o
      displayInformation()     in loca.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [loca] Error 1

では、これをどの関数からも見ることができるようにするには、どのように宣言/使用すればよいでしょうか?

4

2 に答える 2

3

ベスト プラクティスは、ヘッダー ファイルを作成し、global.h などの名前を付けることです。グローバル変数が必要なすべての場所に、ヘッダー ファイルを含めます。ヘッダー ファイルに次のコードを追加します。

//global.h
#include<map>
extern std::unordered_map<string, float> unmap;

次のステップは、たとえば main.cpp で実行できるグローバル変数を定義することです

//main.cpp
#include"global.h"

//definition of the global variable (just once)
std::unordered_map<string, float> unmap;

int main() {
unmap = readParameters("fileName");
}

これで、global.h ファイルを含めるすべての場所でグローバル マップを使用できるようになりました。

それがあなたが探していたものだったことを願っています

于 2013-05-11T15:56:56.143 に答える
3

宣言は、変数を別の場所で定義externしたことをコンパイラに伝えます。表示されているエラーは、変数をどこにも定義していないという事実によるものです。次のような行を追加する必要があります。

unmap params;

ただし、あなたの場合、externグローバル変数が定義されているのと同じファイルでのみ使用されている場合は不要なので、宣言を削除できます。通常extern、1 つの .cpp ファイルでグローバル変数を定義し、それを別のファイルで使用する場合は、ヘッダー ファイルに宣言を置きます。extern本質的には「Y型のXという名前の変数がどこかにある」と言っていますが、実際にはその変数を定義していません。

于 2013-05-11T15:54:41.797 に答える