-1

我不是很习惯,也不太了解 C++ 中全局变量的使用,也无法解决这里的问题,尽管我几乎可以肯定我以正确的方式使用声明。我有一个无序的地图,其中包含来自文件的参数。这工作正常,我已经输出了内容,一切正常。但我希望这个映射在我的程序中随处可用,这样我就不必每次都将它作为参数传递,因此使用全局变量。我有一点 typedef :

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

然后是读取参数的函数:

unmap readParameters(string filename);

然后是全局范围声明(当然,主范围之外的所有内容,尽管在同一个文件中,我仍然没有任何标题):

extern unmap params;

做作是在 main() 函数中进行的:

unmap params=readParameters(inputfile_name);

(注意:我尝试使用和不使用“unmap”,但同样的错误)。我有一个函数 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

extern声明告诉编译器您已在别处定义了该变量。您看到的错误归结为您没有在任何地方定义变量。您需要添加如下一行:

unmap params;

但是,在您的情况下,您可以删除extern声明,因为如果全局变量仅用于定义它的同一文件中,则没有必要。通常,extern当您在一个 .cpp 文件中定义全局变量时,将声明放在头文件中,然后在另一个文件中使用它。extern本质上是在说“某处有一个名为 X 的 Y 类型的变量”,但它实际上并没有定义该变量。

于 2013-05-11T15:54:41.797 回答
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 回答