我试图了解 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的错误(更不可能)。
答案 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。