使用命名空间的全局变量

时间:2017-11-28 13:21:12

标签: c++ namespaces global-variables

我必须在整个项目中使用我的varibles。我刚刚在命名空间中定义了两个字符串变量,并在main.cpp中引用了这个标头。

这里是App.h和App.cpp:

App.h

#include <string>
#include <iostream>

using namespace std;

namespace App
{
    extern string FingerPrint;
    extern string FingerPrintID;
}

App.cpp

#include "App.h"

using namespace std;

string FingerPrint = "";
string FingerPrintID = "";

我正试图在main.cpp中使用这个varibles,如下所示:

的main.cpp

#include "App.h"
#include "Helper.h"

using namespace std;

int main()
{
    App::FingerPrint = Helper().GetFingerPrint();
    App::FingerPrintID  = Helper().GetFingerPrintID();

    cout<<"FingerPrintID: "<<App::FingerPrintID<<endl;
    cout<<"FingerPrint: "<<App::FingerPrint<<endl;

    return 0;
}

当我编译这段代码时,我得到了这个错误:

  

CMakeFiles / HardwareService.dir / main.cpp.o:在函数main': /home/debian/Development/clion-workspace/app/main.cpp:19: undefined reference to App :: FingerPrint'中   /home/debian/Development/clion-workspace/app/main.cpp:20:undefined   引用App::FingerPrintID' /home/debian/Development/clion-workspace/app/main.cpp:23: undefined reference to App :: FingerPrintID'   /home/debian/Development/clion-workspace/app/main.cpp:24:undefined   引用“App :: FingerPrint”

但是,如果我不使用命名空间并使用这个没有'App ::'的变量,它就可以了。 像这样:

App.h

#include <string>
#include <iostream>

using namespace std;

extern string FingerPrint;
extern string FingerPrintID;

App.cpp

#include "App.h"

using namespace std;

string FingerPrint = "";
string FingerPrintID = "";

的main.cpp

#include "App.h"
#include "Helper.h"

using namespace std;

int main()
{
    FingerPrint = Helper().GetFingerPrint();
    FingerPrintID  = Helper().GetFingerPrintID();

    cout<<"FingerPrintID: "<<FingerPrintID<<endl;
    cout<<"FingerPrint: "<<FingerPrint<<endl;

    return 0;
}

没有这样的问题。

我可以在命名空间中使用全局变量吗?如果可以的话,我该如何使用?

2 个答案:

答案 0 :(得分:3)

你没有说你想在app.cpp

中的app命名空间中使用你的变量
#include "App.h"

using namespace std;

string App::FingerPrint = "";
string App::FingerPrintID = "";

应该做的工作

答案 1 :(得分:0)

现在,您只需在某处声明,命名空间App中有两个字符串。你永远不会真正定义那些变量。

它们不会仅仅通过位于与命名空间同名的文件中而最终进入命名空间。 (App.cppnamespace App无关,它只是约定)。

因此,您需要将App::添加到字符串声明中,或将它们包装在namespace App { ... }文件中的.cpp中。

那就是说:全球变数是邪恶的。尝试在AppConfigModel实例中定义它们。在安装过程中,创建并初始化实例,然后将其作为(构造函数)参数传递。