c语言编程简单,但是对于编写面向对象来说,实在是不方便。
一个工程是很多驱动文件的集合,底层驱动文件一般使用c语言来编写,但是一般数据封装和功能实现使用c++开发会更加方便。
所以在工程中使用c语言和c++混合编程是非常又必要的。
第一步先设置一下keil的c++编译环境,只需设计下面一步即可。
a.h文件:
#ifndef _A_
#define _A_
void funA();
#endif
a.c文件:
#include "a.h"
void funA()
{
}
b.h文件:
#ifndef _B_
#define _B_
class B
{
public:
void funB();
}
#endif
b.cpp文件:
#include "b.h"
#include "a.h"
void B::funB()
{
funA();
}
上面2文件是cpp文件里面调用了c文件的函数,这样显然是行不通的。
我们需要把要调用的函数定义和声明的地方添加 extern “C”
a.h文件:
#ifndef _A_
#define _A_
extern “C” void funA();
#endif
a.c文件:
#include "a.h"
extern “C” void funA()
{
}
这样cpp文件去调用c文件的函数就没有问题了,当然在c文件中去使用cpp文件的对象也是ok的。
c.h文件:
#ifndef _C_
#define _C_
extern “C” void funC();
#endif
c.c文件:
#include "c.h"
#include "b.h"
extern “C” void funC()
{
B a;
a.funB();
}
main函数
#include "b.h"
void main()
{
B a;
a.funB();
}
2018-1-5结
到这里kiel中的c和c++混合编程完成
不过最近我发现了一个bug,那就是stm32的定时器用不了,一用程序就会死掉。目前还不知道是什么原因。
2018-1-6结
结果寻找原因和验证,发现是因为中断函数使用c++编译时无法被找到的,所有导致中断函数指针为不可描述的初始地址
导致程序无法执行(死机)。需要在中断函数前加上 extern "C" 即可。
2018-1-9结
使用c++编译,所有的中断函数都需加上 extern "C"
2018-1-9结
使用c++编译,所有c文件调用的c函数都需加上 extern "C"