通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明 。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可 。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数 。
与extern对应的关键字是 static,被它修饰的全局变量和函数只能在本模块中使用 。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰 。2.2、"C"典型的,一个C程序包含其它语言编写的部分代码 。类似的,C编写的代码片段可能被使用在其它语言编写的代码中 。不同语言编写的代码互相调用是困难的,甚至是同一种编写的代码但不同的编译器编译的代码 。
例如,不同语言和同种语言的不同实现可能会在注册变量保持参数和参数在栈上的布局,这个方面不一样 。为了使它们遵守统一规则,可以使用extern指定一个编译和连接规约 。例如,声明C和C标准库函数strcyp(),并指定它应该根据C的编译和连接规约来链接:1extern "C" char* strcpy(char*,const char*);注意它与下面的声明的不同之处:1extern char* strcpy(char*,const char*);下面的这个声明仅表示在连接的时候调用strcpy() 。
extern "C"指令非常有用,因为C和C的近亲关系 。注意:extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言 。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等 。还有要说明的是,extern "C"指令仅指定编译和连接规约,但不影响语义 。例如在函数声明中,指定了extern "C",仍然要遵守C的类型检测、参数转换规则 。
再看下面的一个例子,为了声明一个变量而不是定义一个变量,你必须在声明时指定extern关键字,但是当你又加上了"C",它不会改变语义,但是会改变它的编译和连接方式 。如果你有很多语言要加上extern "C",你可以将它们放到extern "C"{ }中 。2.3、小结extern "C"通过上面两节的分析,我们知道extern "C"的真实目的是实现类C和C的混合编程 。
在C源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,而不是C的编译的连接规约 。这样在类C的代码中就可以调用C的函数or变量等 。(注:我在这里所说的类C,代表的是跟C语言的编译和连接方式一致的所有语言)3、C和C互相调用我们既然知道extern "C"是实现的类C和C的混合编程 。
下面我们就分别介绍如何在C中调用C的代码、C中调用C的代码 。首先要明白C和C互相调用,你得知道它们之间的编译和连接差异,及如何利用extern "C"来实现相互调用 。3.1、C的编译和连接C是一个面向对象语言(虽不是纯粹的面向对象语言),它支持函数的重载,重载这个特性给我们带来了很大的便利 。
为了支持函数重载的这个特性,C编译器实际上将下面这些重载函数:1void print(int i);2void print(char c);3void print(float f);4void print(char* s);编译为:1_print_int2_print_char3_print_float4_pirnt_string这样的函数名,来唯一标识每个函数 。
注:不同的编译器实现可能不一样,但是都是利用这种机制 。所以当连接是调用print(3)时,它会去查找_print_int(3)这样的函数 。下面说个题外话,正是因为这点,重载被认为不是多态,多态是运行时动态绑定(“一种接口多种实现”),如果硬要认为重载是多态,它顶多是编译时“多态” 。C中的变量,编译也类似,如全局变量可能编译g_xx,类变量编译为c_xx等 。
连接是也是按照这种机制去查找相应的变量 。3.2、C的编译和连接C语言中并没有重载和类这些特性,故并不像C那样print(inti),会被编译为_print_int,而是直接编译为_print等 。因此如果直接在C中调用C的函数会失败,因为连接是调用C中的print(3)时,它会去找_print_int(3) 。
推荐阅读
- 一键图片文字提取,图片如何转换成文字
- 三星smart pc,win8系统的平板电脑好用么三星smart pc系列如何
- 滁州哪里有二手车市场,滁州出租车营运证价格是多少目前行情如何
- 人口与房价有什么关系,大家觉得未来房价走势如何
- 米家互联网变频空调怎么样,如何评价米家互联网空调
- 如何成为饿了么配送员,饿了么 怎么配送
- 在百度上搜索谷歌学术,如何谷歌学术论文
- 一个护士的迷茫,护士工作如何调整心态
- 如何加快推进信息化建设,信息化建设期刊怎么样
- 如何创作经济学论文,经济学论文怎么建模
