如何在c++中声明/使用外部映射
How to declare/use extern map in c++
我不太习惯,也不太了解c++中全局变量的使用,也无法解决这里的问题,尽管我几乎可以肯定我使用声明的方式是正确的。我有一个无序的映射,它包含一个文件中的参数。这很好,我已经输出了内容,一切都很好。但我希望这个映射在我的程序中随处可见,这样我就不必每次都把它作为参数传递,因此使用了全局变量。我有一个小字体:
typedef tr1::unordered_map<string,float> unmap;
然后读取参数的功能:
unmap readParameters(string filename);
然后是全局范围声明(当然是main之外的所有内容,尽管在同一个文件中,我仍然没有任何头(:
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
那么,我应该如何声明/使用它才能从任何函数中看到它呢?
extern
声明告诉编译器您已经在其他地方定义了变量。您看到的错误是由于您没有在任何地方定义变量。您需要添加如下行:
unmap params;
但是,在您的情况下,您可以只删除extern
声明,因为如果全局变量仅在定义它的同一文件中使用,则不需要该声明。通常,当您在一个.cpp文件中定义全局变量,然后在另一个.cmp文件中使用它时,您会在头文件中放入extern
声明。extern
本质上是在说"某个地方有一个类型为Y的名为X的变量",但它实际上并没有定义那个变量。
最佳做法是制作一个头文件,并将其称为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 文件的任何地方使用全局地图
我希望这就是您所寻找的
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 从函数角度看ID到文件路径的内部与外部映射
- 张量类,它有自己的存储,但也可以映射外部指针
- 将外部属性映射附加到图形
- 将外部错误代码映射到std :: error_condition
- 如何制作映射纹理的立方体,在内部和外部显示不同的纹理
- boost的问题::内存映射~500MB,外部USB文件
- 将元素从类外部插入到私有映射中
- 外部属性映射绑定到std::矢量在boost图形库
- 如何在c++中声明/使用外部映射