extern "C" {}详解

  extern "C"的真实目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数or变量等。

C++的编译和连接

  C++是一个面向对象语言,它支持函数的重载,为了支持函数重载的这个特性,C++编译器实际上将下面这些重载函数:

void print(int i);
void print(char c);
void print(float f);
void print(char* s);

编译为:

_print_int
_print_char
_print_float
_pirnt_string

  重载被认为不是多态,多态是运行时动态绑定(“一种接口多种实现”),如果硬要认为重载是多态,它顶多是编译时“多态”。C++中的变量,编译也类似,如全局变量可能编译g_xx,类变量编译为c_xx等。连接是也是按照这种机制去查找相应的变量。

C的编译和连接

  C语言中并没有重载和类这些特性,故并不像C++那样print(int i),会被编译为_print_int,而是直接编译为_print等。因此如果直接在C++中调用C的函数会失败,因为连接是调用C中的 print(3)时,它会去找_print_int(3)。因此extern "C"的作用就体现出来了。

C++中调用C的代码

  假设一个C的头文件cHeader.h中包含一个函数print(int i),为了在C++中能够调用它,必须要加上extern关键字。代码如下:

#ifndef C_HEADER
#define C_HEADER extern void print(int i); #endif C_HEADER

相对应的实现文件为cHeader.c的代码为:

#include <stdio.h>
#include "cHeader.h"
void print(int i)
{
printf("cHeader %d\n",i);
}

现在C++的代码文件C++.cpp中引用C中的print(int i)函数:

extern "C"{
#include "cHeader.h"
} int main(int argc,char** argv)
{
print(); //cHeader 3
return ;
}

C中调用C++的代码

  现在换成在C中调用C++的代码,这与在C++中调用C的代码有所不同。如下在cppHeader.h头文件中定义了下面的代码:

#ifndef CPP_HEADER
#define CPP_HEADER extern "C" void print(int i); #endif CPP_HEADER

相应的实现文件cppHeader.cpp文件中代码如下:

#include "cppHeader.h"

#include <iostream>
using namespace std;
void print(int i)
{
cout<<"cppHeader "<<i<<endl;
}

在C的代码文件c.c中调用print函数:

extern void print(int i);
int main(int argc,char** argv)
{
print();
return ;
}

参考:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html

最新文章

  1. 撸一段 SQL ? 还是撸一段代码?
  2. 四核驱动的三维导航—淘宝新UI(设计篇)
  3. 安卓中級教程(7):annotation中的 public @interface的用法
  4. Win10下E3-1231 V3开启Intel虚拟化技术(vt-x)安装HAXM
  5. IOS的浅拷贝和深拷贝
  6. java网络---再论URL &amp; URI
  7. storm启动分析
  8. BootStrap入门教程 (二) :BASE CSS(排版(Typography),表格(Table),表单(Forms),按钮(Buttons))
  9. 关于C#泛型列表List&lt;T&gt;的基本用法总结
  10. 使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案
  11. nopCommerce 3.9 大波浪系列 之 汉化-Roxy Fileman
  12. Oracle 批量增加 / 批量跟新
  13. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  14. 09_组件三大属性(3)_refs和事件处理
  15. FutureTask使用完整演示样例
  16. Condition Variables
  17. 【python】序列切片和range函数
  18. mongodb主从以及auth主从 配置详解
  19. win8安装msi出现提示2503 2502的错误代码
  20. 基于Html5的爱情主题网站–表白神器

热门文章

  1. 3.1 PCI设备BAR空间的初始化
  2. VS2005 添加lib 的方法
  3. live555编译环境
  4. iOS - Quartz 2D 第三方框架 Charts 绘制图表
  5. 【原】从零开始改造淘淘商城(引入dubbo解决项目耦合)02
  6. python拓扑排序
  7. ThreadPoolExecutor线程池参数设置技巧
  8. Splay入门解析【保证让你看不懂(滑稽)】
  9. 【CJOJ2512】gcd之和(莫比乌斯反演)
  10. 【SDOI2009】HH去散步(矩阵快速幂)