问题描述
今天在上嵌入式课时候又学习到了新知识哈,美滋滋~ 情况是这样的,我在STM32F429上跑RT-Thread系统,因为rtt系统里面既有.cpp文件又有.c函数(keil5以上就支持.cpp和.c在同一个工程中共存了),所以当我需要在.c文件里面调用.cpp文件里面的函数的时候就报了下面这个错误,可以看到工程在编译的时候没有问题,但是在链接(linking)的时候报了这个错误,说明工程的问题出现在了链接上,那也就是说单个.cpp和单个.c文件里面是没有语法错误(强烈建议各位程序猿本着消除所有warning的初心敲代码哦):
原因
这是语法错误造成的,.cpp和.c文件编译的方式其实是不一样的,自然在编译之后不能顺利链接起来==,毕竟是面向过程和面向对象的两种语言,所以我们就需要在代码里面做一些小手术啦~
解决办法
可以看到在epos_keyboard.c里面调用了key_lcd()这个函数但是key_lcd()这个函数其实是在 .cpp文件里面定义的哦所以这就导致了前文中出现的链接错误,那么接下来我们来看看 解决办法吧~
extern int key_lcd(int);//加在调用函数的前面
extern "C" int key_lcd(int);//加在函数定义体的前面
最后可以看到问题完美的解决啦~
刨根问底
那么为什么作为底层的芯片里面会用执行效率并不高的C++语言呢?明明C语言的执行效率更高呀!
于是我就去查阅了资料,发现了各中原因。 其实主要是C++语言不但兼容了C语言,而且提供了类的抽象特性,这使得其在嵌入式行业也是有了一席之地。大家想,随着嵌入式操作系统的不断庞大,其系统的代码量肯定也是会不断增加的,那么纯粹的使用C语言来进行维护和撰写的话就会显得系统有些臃肿,这时候不但可以兼容C语言,而且可以提供抽象的C++则成为了嵌入式操作系统的好帮手,这也是我们为什么要从语法角度上学习将这2门语言结合起来的原因。
总结
C++和C语言在嵌入式领域的配合会越来越普遍,所以如何将C++文件和C文件放到在同一个工程中使用也是一个非常重要的知识点哦~
(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧