2013-05-11 536 views
-2

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

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 

所以,我应该如何申报/使用它可以从任何函数中看到它?

+0

http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c我认为这是详细解释。 – fonZ 2013-05-11 15:37:03

+0

谢谢我明白了!我已经阅读这篇文章,但似乎我错位了变量的声明。 – 2013-05-14 09:29:34

回答

2

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

unmap params; 

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

+0

“没有在任何地方定义变量”。我感到非常愚蠢,我改变了源文件中常量的名字,这就是为什么头文件与源文件不匹配的原因。 – 2015-06-19 18:42:41

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

我希望那是你已经看过什么