在工作中C、C密不可分做我们嵌入式方面的当然更多的是C但有时候却少不了C而且是C、C混搭混合编程在一起的比如RTP视频传输live555多媒体播放等都是C下的他需要调用JRTPLIB库再比如我那邮件发送我也用C写的定义了一个Email对象包含了成员收发邮件地址用户名密码等以及方法邮件头、Base64编码和邮件发送这些操作很好用所以很多时候C还是蛮不错的。。。。但*.c与*.cpp文件混搭在一起不是那么的简单知识总是用时方恨少啊现在我们就来慢慢的了解吧。一、extern“C”的作用最重点1. extern C的真实目的是实现类C和C的混合编程。extern “C”是由提供的一个连接交换指定符号用于告诉这段代码是函数。extern “C”后面的函数不使用的C的名字修饰,而是用C。这是因为C编译后库中函数名会变得很长与C生成的不一致造成不能直接调用C函数。2.C语言支持函数重载C语言不支持函数重载。函数被C编译后在库中的名字与C语言的不同。假设某个函数的原型为void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo而C编译器则会产生像_foo_int_int之类的名字。C提供了C连接交换指定符号extern“C”来解决名字匹配问题。3.被extern C限定的函数或变量是extern类型的extern是C/C语言中表明函数和全局变量作用范围可见性的关键字该关键字告诉编译器其声明的函数和变量可以在本模块或其它模块中使用。被extern C修饰的变量和函数是按照C语言方式编译和连接的。4.与extern对应的关键字是static被它修饰的全局变量和函数只能在本模块中使用。因此一个函数或变量只可能被本模块使用时其不可能被extern “C”修饰。二、extern“C”与__cplusplus#ifdef __cplusplusextern C {#endif#ifdef __cplusplus}#endifCplusplusC plus plus即C用于C文档的头文件中上面代码的意思是如果是C文件*.cpp后缀则使用extern “C”在C项目中应用的非常广泛。即使用gcc编译器编译函数名为C类型如_foo。个人认为搞懂了这两个关键字尤其是理解extern C再次强调不为过呵呵接下来的混合编程也就差不多了哈哈哈。。。。三、C调用C函数接口1.设计程序共四个文件animal.cpp animal.h main.c Makefile1.1 animal.h[rootlocalhost CC]#cat animal.h#ifndef __ANIMAL_H__//防止被重复包含#define __ANIMAL_H__#ifdef __cplusplusextern C {#endifclassANIMAL{public:ANIMAL(char* );~ANIMAL();char* getname(void);private:char* name;};void print(void);#ifdef __cplusplus}#endif#endif // __ANIMAL_H__1.2 animal.cppC文件[rootlocalhost CC]#cat animal.cpp#include animal.h#include iostreamusing namespace std;ANIMAL::ANIMAL(char* data)//构造函数{ name new char[64];strcpy(name, data);}ANIMAL::~ANIMAL()//析构函数{if(name){delete[] name;name NULL;}}char* ANIMAL::getname(void){ return name;}voidprint(void)//对外接口而且必须有一个非类中方法才能被C调用{ANIMAL animal(dog);char* animal_name animal.getname();cout animal name is : animal_name endl;}1.3 main.cC文件[rootlocalhost CC]#cat main.cint main(void){print();return 0;}1.4 Makefile[rootlocalhost CC]#cat Makefilemain:main.c animal.ogcc-lstdcmain.c animal.o -o mainanimal.o:animal.hg -c animal.cpp.PHONY : cleanclean:-rm animal.o main2.测试2.1生成可执行程序main[rootlocalhost CC]#makeg -c animal.cppgcc -lstdc main.c animal.o -o main2.2运行可执行程序main[rootlocalhost CC]#./mainanimal name is :dog四、C调用C函数应该这个比较简单我就不多写了就直接写代码。共有三个文件1.h 1.c main.cpp[rootlocalhost aa]#cat 1.h#ifndef _1__H_#define _1__H_extern void print(char* );#endif[rootlocalhost aa]#cat 1.c#include stdio.h#include 1.hvoid print(char* data){printf(%s\n, data);}[rootlocalhost aa]#cat main.cppextern C{#include 1.h}int main(void){print(“hello,world\n”);return 0;}gcc –c 1.cg main.cpp 1.o接着./a.out又可以出现我们神奇的hello,world了C调用C代码很简单但C调用C接口可把我给累坏了苦啊。就是这个gcc后面跟的-lstdc害的出现undefined reference to __gxx_personality_v0这个错误。是因为你用gcc编译.cpp文件animal.cpp.按系统默认.cpp文件是c的文件格式。当然混搭时我还遇到了其他的一些问题都是一些小问题如果上面解释的还不足以让你解决C\C混合编程的问题可以联系我哦.