如何在多个.cpp文件中使用全局变量?

时间:2015-05-28 18:48:10

标签: c++ global-variables extern multiple-files

我有这个简单的程序,它试图在一个单独的文件中打印我的全局变量。我正在使用 Visual Studio 2013专业版 IDE。

print.h

#ifndef PRINT_H_
#define PRINT_H_

void Print();

#endif

print.cpp

#include "print.h"

#include <iostream>

void Print()
{
    std::cout << g_x << '\n';
}

source.cpp

#include <iostream>
#include <limits>

#include "print.h"

extern int g_x = 5;

int main()
{
    Print();

    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin.get();

    return 0;
}

我收到编译错误 error C2065: 'g_x' : undeclared identifier

我已经通过这个论坛进行了搜索,却找不到其他人遇到我的问题。我尝试在单独的.cpp文件中重新声明我的全局变量但没有成功。如您所见,我已经包含了必要的标题保护,并为我的全局变量分配了extern关键字。这是我第一次在多个文件中测试全局变量。显然,我错过了一些简单的事情。我需要更改或添加什么才能使我的程序正常工作?

编辑:我发现这个topic对于理解extern和全局变量定义之间的区别非常有用。

3 个答案:

答案 0 :(得分:3)

编译器正在编译print.cpp。它在编译source.cpp时对print.cpp一无所知。因此,g_x中放置的source.cpp在编译print.cpp时绝对没有用,这就是您收到错误的原因。

您可能想要做的是

1)将extern int g_x;放在print.h内。然后编译器在编译g_x时会看到print.cpp

2)在source.cpp中,从extern声明中删除g_x

int g_x = 5;

答案 1 :(得分:2)

将您的全局声明移至公共标题,例如 common.h

#ifndef COMMON_H_
#define COMMON_H_

extern int g_x;   //tells the compiler that g_x exists somewhere

#endif

<强> print.cpp

#include <iostream>

#include "print.h"
#include "common.h"

void Print()
{
    std::cout << g_x << '\n';
}

<强> source.cpp

#include <iostream>
#include <limits>

#include "print.h"
#include "common.h"

int g_x;

int main()
{
    g_x = 5;   //initialize global var
    Print();

    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin.get();

    return 0;
}

在其他.cpp文件中,您可以访问g_x,包括 common.h 标题。

答案 2 :(得分:0)

extern int g_x;

属于.h,您需要添加

int g_x =5; 

一些.cpp。