我不是很习惯,也不太了解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
那么我应该如何声明/使用它来从任何函数中看到它?
答案 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
的任何地方使用全局地图我希望那就是你所寻求的