link :有好些例子可以参考。
(此文中的定义(Defintition)和许多处说的“初始化”是一码事哈。)
1.声明和定义的区别
(Declaration and Definition)
①声明只是告诉程序它的存在,并不分配内存给它,当一个 变量 或 函数 被定义的时候,系统就会给它分配内存。
②一个 变量 或 函数 可以被声明多次,但是它只能被定义一次。
③“extern”可以理解为“外部声明”。
2.函数 和 “extern”
当我们写
int foo(int arg1, char arg2);
此时,编译器视作:
extern int foo(int arg1, char arg2);
也就是说,即使不添加关键字“extern”,默认情况会隐式假定了“extern”。这个函数也可以被整个工程文件的所有文件读取,和添加了“extern”的函数一样。只要其他文件声明了该函数,那么它就可以使用它(因为有了函数的声明,编译器就知道函数的定义所存在的位置了)。
3.变量 和“extern”
首先,我们声明而不定义一个变量:
extern int var;
此时,我们extern声明了一个变量,目前没有被定义。它仅仅是告诉编译器它会在别处被定义。因此,它也没有被分配内存。所以,我们可以多次这样声明这个变量。
不过,如果我们写作:
int var
此时,这个 变量 被同时声明和定义了,也就是说,它已经被分配了内存空间了。在这个例子中,尽管你没有给 var
赋值,但是你仍然可以输出 var
。
和函数一样的是,当它被冠以“extern”的关键字时,它可以在整个项目中使用,只要我们在用的时候把它声明和定义出来就可以了。
注意:只有被分配了内存的变量和函数可以赋值和操作,否则会报错。
4.extern 用于多文件
somefile.h:
extern int global_x;
void print_global_x();
test.cpp:
#include "header.h"
int global_x;//重新的声明并定义了,也就是有分配内存了
int main(){
global_x = 5;
print_global_x();
}
void print_global_x(){
std::cout << global_x << std::endl;
}
用 extern
已经声明的变量,它还没有被分配内存,只有当在查找 包含的“somefile.h”中找到 var 的定义的时候,才会被分配内存。也就是说,没有包含“somefile.h”的话,便不可以赋值操作,因为这个 extern 声明 并不赋予内存。
5.extern和const的结合运用
对于 const 变量,其具有默认具有内部链接。如果您希望变量具有外部链接,请将 extern 关键字应用于定义以及其他文件中的所有其他声明
//Source 1 :
extern const int global = 255; //a definition of global const variable in C++
//Source 2 :
extern const int global; //declaration
以下是错误的方式:
Source 1 :
const int global = 255; //wrong way to make a definition of global const variable in C++
Source 2 :
extern const int global; //declaration
6.总结
- 声明可以重复许多次,定义不可以。
- 关键字“extern”主要用于延展 变量 或 函数 到整个工程文件。
- 在函数中,即使不用关键字“extern”,也会隐式的使用它的功能。
- 当一个 变量 使用“extern”的时候,它只会被声明儿不会被定义。