转自:https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
1.基本
它是用来声明变量或者函数,说明在其他文件中被定义,那么链接时就在其他模块中寻找。
用来说明“此变量/函数是在别处定义的,要在此处引用”。
例子:
(1) 在test1.h中有下列声明: #ifndef TEST1H #define TEST1H extern char g_str[]; // 声明全局变量g_str void fun1(); #endif (2) 在test1.cpp中 #include "test1.h" char g_str[] = "123456"; // 定义全局变量g_str void fun1() { cout << g_str << endl; } (3) 以上是test1模块, 它的编译和连接都可以通过,如果我们还有test2模块也想使用g_str,只需要在原文件中引用就可以了 #include "test1.h" void fun2() { cout << g_str << endl; }
这样的话g_str就是全局变量,一般这么来声明,而不能用static在头文件中声明+定义,那样会造成其他文件的污染。
如果在头文件中直接声明而不加extern,那么多此包含head文件,就会产生重定义的错误。
2.作用
https://blog.csdn.net/big_bit/article/details/51595714
在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以:
- 使用头文件,然后声明它们,然后其他文件去包含头文件
- 在其他文件中直接extern
3.定义与声明
1.定义也是声明,extern声明不是定义,即不分配存储空间。extern告诉编译器变量在其他地方定义了。
extern int i; //声明,不是定义 int i; //声明,也是定义
2.如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。
extern double pi=3.1416; //定义
3.函数的声明和定义区别比较简单,带有{}的就是定义,否则就是声明。
extern double max(double d1,double d2); //声明 double max(double d1,double d2){}//定义
4.除非有extern关键字,否则都是变量的定义。
extern int i; //声明 int i; //定义
4.总结
1. 不要把变量定义放入.h文件,这样容易导致重复定义错误。
2. 尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。(static修饰的变量作用域就是当前文件)
3. 可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。