如何在c ++中声明/使用extern map

时间:2013-05-11 15:33:06

标签: c++ map extern

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

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

然后读取参数的函数:

unmap readParameters(string filename);

然后是全局范围声明(当然主要的一切,虽然在同一个文件中,我仍然没有任何标题):

extern unmap params;

在main()函数中进行了修饰:

unmap params=readParameters(inputfile_name);

(注意:我尝试使用和不使用“unmap”,但同样的错误)。 我有一个函数displayInformation()来显示其中我使用我的地图“params”的内容:

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

那么我应该如何声明/使用它来从任何函数中看到它?

2 个答案:

答案 0 :(得分:2)

extern声明告诉编译器你在别处有定义变量。您看到的错误是由于您没有在任何地方定义变量。您需要添加如下所示的行:

unmap params;

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

答案 1 :(得分:2)

最佳做法是创建一个头文件并将其称为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

的任何地方使用全局地图

我希望那就是你所寻求的