如何在c++中声明/使用外部映射

How to declare/use extern map in c++

本文关键字:外部 映射 声明 c++      更新时间:2023-10-16

我不太习惯,也不太了解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 文件的任何地方使用全局地图

我希望这就是您所寻找的