C++ 知识点
C和C++混合编程
前言
C语言在各类单片机开发中占据着重要的地位,不管是学习51、STC还是STM32等单片机,都需要学习者有一个良好的C语言基础,至少要懂得基本数据结构、逻辑判断、指针等基础的知识点。如果想要学的更深一些,就需要了解结构体、枚举、函数指针、回调函数等一些C语言高级用法。
以STM32来说,目前主流的HAL库将诸多外设都进行了抽象化,硬生生的将底层和用户层进行了分离,从它的源码中我们可以看到好多的结构体,各种函数指针、回调函数满天飞。可以说,用C语言确实能够实现面向对象的编程思路,但同样的,需要耗费很大的精力去写程序。
在网上也经常看到C++效率低,不能用于单片机编程的说法。但是随着科技发展,单片机的性能也是飞速提高,包括内存空间也是越来越大,一般的项目用起来绰绰有余,C++比C低的那点效率基本可以忽略不计。
大名鼎鼎的Arduino,其各式各样的库都是用C++写的,创客用起来都非常的方便。而且常用的Arduino开发板,芯片是8位的。因此,对于STM32这类单片机来说,使用C++编程是肯定能够带起来的。
C与C++程序是如何相互调用的
关于C文件和C++文件相互调用的方法,在网上也有较多的解答。因此这里我就简单的介绍一下方法。
关键就是使用extern "C"的指令,其中的C,表示的是一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言。
由于C和C++的特性不同,一个是面向过程的语言,一个是面向对象的语言。因此,C++中的很多特性,比如函数的重载,在使用时就给我们带来了很大的便利。而为了实现C++中的这些特性,程序在编译后就会对函数“改名”,比如在C++中定义一个函数:
void func(int i,char c)
那么编译后,函数的名称可能就会变为:
_func_i_c
而对于C语言来说,并没有C++中的重载和类这些特性,因此上述函数编译后名称可能直接就是:
_func
1 非常简单粗暴。 正是这两种语言编译方式的不同,就会导致两种程序在调用的时候出现错误。因此就需要我们采用C++中的指令extern “C” 来实现两种语言文件的互相调用。
注意一下,extern “C” 关键字是在C++中的,如果在.C文件中使用,会出现以下错误:
error: expected identifier or ‘(’ before string constant
define 参数的用法
define 语句中的#是把参数字符串化,##是链接两个参数成为一个整体。
#define FACTORY_REF(name) { #name, Make##name }
中#name就是将传入的name进行字符串化,Make##name就是将Make跟name进行连接,使它们成为一个整体
1##:
是一个连接符号,就是用于把参数连在一起 例如: #define fun(arg) my##arg fun(hello) 相当于 myhello
2.#:
是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串 例如: #define STRCPY(dst, src) strcpy(dst, #src) 则 STRCPY(buff, hello) 相当于 strcpy(buff, "hello")
文档信息
版权声明:可自由转载(请注明转载出处)-非商用-非衍生
发表时间:2023年4月13日 09:09