extern的学习——CPP

extern学习

变量声明

由于CPP支持分离式编译,所以如果程序被分成若干个文件,则需要一种方法来保证代码共享。因此,CPP将声明和定义分开,声明使得名字为程序所知,而定义则是创建与该名字相关联的实体。

因此,如果想要声明一个变量,而不是定义它,则在变量名前加上extern关键字。如果extern语句中包含初始值,则不再是声明了,而是定义:

1
2
extern int i; //声明
extern int i = 0; //定义

注意:

  1. 不能在函数里试图初始化一个由extern关键字标记的变量,会造成重定义的错误。
  2. extern时要严格对应声明时的类型,例如:定义的是数组,不可以extern指针。

用法:通常在模块的头文件中对本模块提供给其它模块引用的的函数和全局变量以extern声明,然后其它的模块在使用时只需要include该头文件即可。

extern "c"

CPP程序有时需要调用其他语言编写的函数,最常见的就是调用C语言编写的函数,虽然编译器在处理其调用方式上与CPP相同,但生成的代码会有所区别。例如CPP为了解决多态性的问题,会将函数名字与参数连在一起生成一个中间函数的名称,而C语言不会,因此这样会造成编译器找不到该函数。

为了避免这个问题,CPP提供了链接指示,指出如何处理非CPP的语言。常见做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef __cplusplus
#if __cplusplus
extern "C"{
 #endif
 #endif /* __cplusplus */
 …
 …
 //.h文件结束的地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */

参考

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html