与extern混淆

时间:2016-07-18 11:34:36

标签: c++ extern

//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;来自另一个文件的变量

1 个答案:

答案 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而不是错误。我真的不确定这是否是一个预期的功能,或者只是一个之前没有人发现的错误,因为没有人会想到尝试这样的事情。