为什么需要在头文件中声明变量,然后在相应的cpp文件中再次声明变量:
一个。防止链接错误
ex. header 1.h-
namespace forglobal {
extern int x;
}
source 1.cpp-
namespace forglobal{
int x=6;
}
source 2.cpp-
#include "1.h"
cout<<x; //6
湾在不同的cpp文件中使用,我不能像我调用函数ex那样使用命名空间。
header -1.h
namespace forglobal {
int x
}
source -1.cpp {
namespace forglobal {
void change() {
x=5;
}
}
}
source -2.cpp
#include "1.h"
forglobal::change();
cout<<forglobal::x<<'\n'; //5
答案 0 :(得分:1)
任何未声明为extern
的命名空间级变量声明也是一个定义。也就是说,如果您的标题包含非extern
变量声明,该声明包含在链接到程序中的多个翻译单元中,您将获得多个定义。为防止这种情况,请将标头中的变量声明标记为extern
,并省略定义所在的extern
。
当然,首先使用全局变量通常是一个坏主意,但这是一个不同的讨论。
答案 1 :(得分:1)
这个问题与C ++中的一个基本概念有关,即一个定义规则(ODR)。 正如DietmarKühl所说,没有“extern”,你对同一个变量有多个定义会违反ODR。
但是,在C ++中,您可以拥有尽可能多的声明。基本上声明在范围中引入了名称,定义为变量分配了一些内存。
请参阅Bjarne Stroutstrup的书,“C ++编程语言”。
答案 2 :(得分:0)
在第二种情况下,您在两个位置为变量x分配空间,因此链接器不知道如何访问变量。在前者中,只分配了一个地方,因此没有混淆。