//second.h
int a=2;
//main.cpp
include<iostream>
static int a=1;
extern int a;
int main(){
std::cout << a ;
}
输出为1,为什么不是2?为什么没有错误?我希望有一个&#39; a&#39;来自另一个文件的变量
答案 0 :(得分:0)
extern
使编译器将该行视为声明而不是定义。也就是说,
extern int a;
声明已在某处定义了变量a
,并且将在链接时出现。它在同一个文件中(因而不是真正的&#34;外部&#34;)并没有真正发挥作用。它可以是外部的,只是它不会发生。
至于为什么没有错误...除非你的主要有
#include "second.h"
那么你不能指望它以任何方式被考虑。编译在源(&#39; cpp
&#39;)文件中进行;它只涉及您明确告诉#include
的标题。如果这样做,则会出现变量重定义错误。
如果您添加第二个源文件,请将它们一起编译,并在主文件中注释掉static int a = 1;
,然后确实获得a=2
。
如果你没有对该行发表评论,那么在VS2015中似乎会static
影响extern
,你会得到a=1
而不是错误。我真的不确定这是否是一个预期的功能,或者只是一个之前没有人发现的错误,因为没有人会想到尝试这样的事情。