C ++:我无法理解'extern'关键字在我的程序中是如何工作的

时间:2014-06-28 21:20:33

标签: c++ extern

我试图了解 extern 在C ++中是如何工作的。在StackOverflow上有很多关于这个关键字的问题,但没有一个问题澄清了我的问题:

情况1

AuxSource.cpp

int GlobalVar = 5;

Source.cpp

#include <iostream>
#include <conio.h>
#include "AuxSource.cpp"


int main()
{
    std::cout << GlobalVar;
    return 0;
}

错误:找到一个或多个多重定义的符号

错误:int GlobalVar已在AuxSource.obj中定义

//到底是什么意思!?我定义了一次!

情况2

AuxSource.cpp

int GlobalVar = 5;

Source.cpp

#include <iostream>
#include <conio.h>
#include "AuxSource.cpp"

extern int GlobalVar; // added

int main()
{
    std::cout << GlobalVar;
    return 0;
}

错误:找到一个或多个多重定义的符号

错误:"int GlobalVar"已在AuxSource.obj中定义

//相同的错误。

情况3

AuxSource.cpp

int GlobalVar = 5;

Source.cpp

#include <iostream>
#include <conio.h>
// #include "AuxSource.cpp" - deleted

extern int GlobalVar;

int main()
{
    std::cout << GlobalVar;
    return 0;
}

//它有效,但这怎么可能?

每个教程都使用包含外部(非主要)文件和一些全局变量以及外部重新声明+变量在另一个模块中使用的组合,但它对我不起作用。要么我仍然不理解extern的概念或我VS2013的错误(更不可能)。

3 个答案:

答案 0 :(得分:3)

你的问题是:

#include "AuxSource.cpp"

通常,您不包含*.cpp个文件,但包含相应的*.h文件。所以你可以有一个头文件AuxSource.h,其中包含:

extern int GlobalVar;

然后,您在每个源文件中#include "AuxSource.h",因此每个源文件都会获得extern声明。

int GlobalVar = 5;实际定义将保留在AuxSource.cpp中,只会编译一次。

答案 1 :(得分:1)

这与关于链接的extern无关。

int GlobalVar = 5;

GlobalVar默认具有外部链接。尝试

const int GlobalVar = 5; //internal linkage

有关详细信息,请参阅here

答案 2 :(得分:1)

include告诉编译器在编译之前将一个文件的副本包含到另一个文件中。链接器只喜欢定义一次符号。所以这句话:

#include "AuxSource.cpp" 

导致GlobalVar定义两次:一次在AuxSource.cpp中,第二次在文件中包含 AuxSource.cpp(Source.cpp)。所以AuxSource.cpp和Source.cpp都有相同的代码:     int GlobalVar = 5;

这就是链接器告诉您GlobalVar符号多次定义的原因。

在一个文件中使用另一个cpp文件中需要使用全局变量的常用模式是:

AuxSource.cpp:

int GlobalVar = 5;

AuxSource.h:

extern int GlobalVar;

Source.cpp:

#include <iostream>
#include <conio.h>
#include "AuxSource.h"

int main()
{
    std::cout << GlobalVar;
    return 0;
}

这样你就可以把#include&#34; AuxSource.h&#34;在许多文件中,并且能够使用位于AuxSource.cpp中的一份GlobalVar。