源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

深入理解C/C++混合编程

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

扫一扫进微信版
返回顶部