嵌入式 C/C++混合编程

原创 2013年12月02日 14:52:35
在工作中,C、C++密不可分,做我们嵌入式方面的,当然更多的是C,但,有时候却少不了C++,而且是C、C++混搭(混合编程)在一起的,比如,RTP视频传输,live555多媒体播放等都是C++下的,他需要调用JRTPLIB库,再比如,我那邮件发送,我也用C++写的,定义了一个Email对象,包含了成员:收发邮件地址,用户名,密码等,以及方法:邮件头、Base64编码和邮件发送这些操作,很好用,所以,很多时候,C++还是蛮不错的。。。。但,*.c与*.cpp文件混搭在一起,不是那么的简单

 

一、extern“C”的作用(最重点)

   1. extern"C"的真实目的是实现类CC++的混合编程extern“C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数extern“C”后面的函数不使用的C++的名字修饰,而是用C。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数。

   2.C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x, inty);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

   3.extern"C"限定的函数或变量是extern类型的;externC/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。被extern"C"修饰的变量和函数是按照C语言方式编译和连接的。   

    4.与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern“C”修饰。

 

二、extern“C”__cplusplus

#ifdef__cplusplus

      extern "C" {

      #endif

 

      #ifdef __cplusplus

      }

      #endif

   CplusplusC plusplus"C++"用于C++文档的头文件中,上面代码的意思是:如果是C++文件(*.cpp)后缀,则使用extern“C”,在C++项目中应用的非常广泛。即使用gcc编译器编译,函数名为C类型如_foo。个人认为,搞懂了这两个关键字,尤其是理解extern"C"(再次强调,不为过,呵呵),接下来的混合编程也就差不多了偷笑

 

三、C调用C++函数(接口)

1.设计程序,共四个文件

animal.cpp animal.h main.c Makefile

1.1animal.h

[root@localhostCC++]#catanimal.h

#ifndef__ANIMAL_H__  //防止被重复包含

#define__ANIMAL_H__

#ifdef__cplusplus

extern "C"{

#endif

classANIMAL{

public:

       ANIMAL(char* );

       ~ANIMAL();

       char* getname(void);

private:

       char* name;

};

voidprint(void);

#ifdef__cplusplus

}

#endif

#endif // __ANIMAL_H__

 

1.2animal.cppC++文件

[root@localhostCC++]#catanimal.cpp

#include"animal.h"

#include <string.h>

usingnamespace 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.3main.cC文件

[root@localhostCC++]#catmain.c

intmain(void)

{

       print();

       return 0;

}

 

1.4Makefile

[root@localhostCC++]#catMakefile

main:main.canimal.o

       gcc-lstdc++ main.c animal.o -o main

animal.o:animal.h

       g++ -c animal.cpp

.PHONY: clean

clean:

       -rm animal.o main

 

2.测试

2.1生成可执行程序main

[root@localhostCC++]#make

g++ -canimal.cpp

gcc-lstdc++ main.c animal.o -o main

2.2运行可执行程序main

[root@localhostCC++]#./main

animalname is :dog

 

四、C++调用C函数

应该这个比较简单,我就不多写了,就直接写代码。

共有三个文件:1.h 1.c main.cpp

[root@localhostaa]#cat1.h

#ifndef_1__H_

#define_1__H_

extern voidprint(char* );

#endif

 

[root@localhostaa]#cat1.c

#include

#include"1.h"

voidprint(char* data)

{

       printf("%s\n",  data);

}

 

[root@localhostaa]#catmain.cpp

extern"C"{

#include"1.h"}

intmain(void)

{

       print(“hello,world\n”);

       return 0;

}

 

gcc –c1.c

g++ main.cpp1.o

 

   接着./a.out,又可以出现我们神奇的hello,world了,C++调用C代码很简单,但C调用C++接口可把我给累坏了,苦啊。就是这个gcc后面跟的-lstdc++害的哭,出现undefinedreference to`__gxx_personality_v0'这个错误。是因为你用gcc编译.cpp文件(animal.cpp).按系统默认.cpp文件是c++的文件格式。

相关文章推荐

嵌入式C++开发详解(一)

嵌入式C++开发详解(一) 一、C++概述 1.嵌入式开发中为什么选择C++语言? (1)面向过程编程的特点 C语言特点:C语言是在实践的过程中逐步完善的 ·没有深思熟虑...

嵌入式C++实战开发详解(一)

一、面向过程编程 VS 面向对象编程 1、面向过程的特点: a、c语言特点: (1)c语言是在实践的过程中逐步完善起来的   没有深思熟虑的设计过程,使用时存在很多“灰色地带” (2)残留...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

浅谈C语言嵌入式系统编程注意事项

C语言嵌入式系统编程注意事项之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧  不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

【重要】C/C++/嵌入式,必会的理论概念

【C 语言】 1、 C 和 C++有什么不同? 1)C语言面向过程编程,重程序的实现;C++面向对象编程,重程序的设计; 2)C是C++的一个子集;C++全面兼容C; 3)C++相对于C引入了重载、内...

Cocos2d-x从入门到精通第15课《即时动作》

Cocos2d-x的即时动作

Cocos2d-x从入门到精通第17课《变速动作》

Cocos2d-x的变速运动

嵌入式C和汇编混合编程规则——ATPCS规则

ATPCS规则  为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则。 一.ATPCS概述 AT...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 C/C++混合编程
举报原因:
原因补充:

(最多只允许输入30个字)