extern "C" {}详解
extern "C"的真实目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数or变量等。
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(3); //cHeader 3 return 0; }
现在换成在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(3); return 0; }
参考:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html
原文:http://www.cnblogs.com/jeakeven/p/5066281.html