extern关键字

来源:互联网 发布:日事清 知乎 编辑:程序博客网 时间:2024/05/01 21:42
网上对于extern关键字的文章特别多,但是看完之后总会有一种似懂非懂的感觉,感觉说的都有理,但是真正去用的时候还是会跳入误区。

C++对变量分为声明和定义。如果想声明一个变量,在变量定义之前加上extern关键字即可。

int i = 0; // 声明并定义extern int i; // 声明i,而非定义i
需要注意的是如果给extern修饰的变量赋以一个初值的话,此时是定义而非声明。
extern int i = 0; // 定义而非声明
如果在多文件中引用一个变量的话,必须把定义和声明分开,只能在一个源文件中定义变量,而在其他文件中要用到的话只需声明便可。

/* test01.cpp */

int i = 0;
/*test02.cpp*/
extern int i;cout << i <<endl;
注意:一个变量不能重复定义
/* test01.cpp */
int i = 0;
/* test02.cpp*/
extern int i = 0; // 此处是定义而非声明cout << i <<endl;
对于const对象只在本文件中有效,若想在另一个文件中使用的话必须在定义和声明的时候都加上关键字extern

/* test01.cpp */

extern const int i = 0; // 注意在定义的时候需加上extern
/* test02.cpp*/
extern int i;cout << i <<endl;
extern还可以修饰函数,此处暗示此函数可能在其他的文件中有定义,目的在于告诉编译器有这个函数存在,你别给我报错。
extern void print();void print();
这两个函数没有什么区别。
其次extern还有一个作用就是取消C++的函数改名,这个要从重载说起,有些编译器其实是把C++代码翻译成C代码运行的,那么不支持重载的C怎么区别两个函数名相同的函数呢?这就要用到C++的一个特性,函数改名,C++编译器再编译你的代码时,可不是那么老实,它会偷偷把你的函数名换了,至于换成了什么样的名字,不同的编译器有不同的规则,换过的函数名会包含函数的返回值类型,实参个数等等,所以C++可以支持重载。ok,说到这里能说明什么,C函数是不会换名的,如果你写了一个C++函数,而想拿到C中去用的话,就要考虑换名问题了,这时候只要在代码前面加上:
extern "C";
C++的函数就会乖乖的听话,不会更换名字了。


1 0