首先我所理解的extern是用于将全局变量局部化。在程序链接期间,链接器根据你的变量或者函数首先要去他定义的地方,如果在当前这个编译单元内没有找到。那么就肯定会报错,不管你是否有进行声明什么的。 但是如果你有对这个函数或变量前面加一个extern声明,那么链接器就会去别的地方寻找它定义的地方了。还有就是就算声明使用了extern,但是当前的编译单元有对这个函数或者变量进行定义,那么就不需要要在去外部查找了,也就相当于覆盖了外部的(说是这么说,你想都找到了还去外面找什么找??)。哦还有一点提下我这里说的编译单元指的是.cpp文件(当然报告里面包含的头文件。)
eg
extern.cpp code 首先extern.cpp 在编译过程中
#include <iostream>
#include "testExtern2.h"
extern void FuncForExtern(void);
extern int ValueForExtern;
extern void FuncForExtern2(void);
extern void FuncForExtern3(void);
extern int ValueUseExtern; //没有定义的地方
int main()
{
FuncForExtern(); //去别的编译单元查找.cpp
FuncForExtern2(); //头文件已经包含.h
FuncForExtern3(); //哦 no error
std::cout << ValueForExtern << std::endl;
std::cout << ValueUseExtern<< std::endl;//错误 Link Error
getchar();
return 0;
}
testExtern1.cpp code
#include <iostream>
int ValueForExtern = 10;
(void FuncForExtern(void)
{
std::cout << "TestExtern1.cpp FuncForExtern" << std::endl;
}
testExtern2.h code .h文件中的内容只要被包含就可以了,如果没有被包含那么你不要想那么多了 用不了 (不过你定义的地方就是在它里面 哦 我所指的包含是。。。)下面的.h可以试试
#include <iostream>
void FuncForExtern2()
{
std::cout << "FuncForExtern2 testExtern2" << std::endl;
}
testExtern3.h code
#include <iostream>
void FuncForExtern3(void)
{
std::cout << "testExtern3.1 FuncForExtern3" << std::endl;
}
自己理解 不对之处 还望指出, 不希望误人子弟。还是自己写写。