继续创造,加速成长!这是我参加「日新方案 6 月更文挑战」的第20天,点击查看活动概况

引言

咱们在日常的嵌入式开发中,经常会遇到各种C/C++的运用问题,并且C/C++纯软件的常用开发技巧有些嵌入式并不常用,而嵌入式开发中运用到的C/C++常识与技巧有些也十分特别,这儿咱们来详细介绍一下嵌入式开发常用技巧及C/C++常识。

static 静态变量

静态大局变量:在大局变量前,加上关键字static,该变量就被界说成为一个静态大局变量。
静态大局变量有以下特点:

  1. 该变量在大局数据区分配内存
  2. 未经初始化的静态大局变量会被程序主动初始化为0(在函数体内声明的主动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的主动变量也会被初始化为0)
  3. 静态大局变量在声明它的整个文件都是可见的,而在文件之外是不可见的
    静态变量都在大局数据区分配内存,包括后边即将提到的静态局部变量。关于一个完好的程序,在内存中的散布状况:

代码区

low address

大局数据区堆区栈区

high address

一般程序把新产生的动态数据存放在堆区,函数内部的主动变量存放在栈区。主动变量一般会跟着函数的退出而开释空间,静态数据(即使是函数内部的静态局部变量)也存放在大局数据区。大局数据区的数据并不会由于函数的退出而开释空间。
界说大局变量就能够完成变量在文件中的共享,但界说静态大局变量还有以下优点:

  1. 静态大局变量不能被其它文件所用
  2. 其它文件中能够界说相同名字的变量,不会产生冲突

‘##’衔接符

##用来衔接前后两个参数,把它们变成一个字符串。
例子如下:

#define main(x,y) x##y
int xy=1;
cout < < main(x,y) < < endl; 

将会使编译器把
cout < < main(x,y) < < endl;
解释为
cout < < xy < < endl;
理所当然,将会在规范输出处显示’1’。
从此能够看出,x##y的效果就是将x和y连在一起了。
而#define main(x,y) x##y 则相当于把main(x,y)等价于x##y

断语函数

首要作用:是对一个bool型表达式进行查看,一个正确运转的程序有必要确保这个bool型表达式的值为true,若表达式的值为false,则说明程序已处于一种不正确的状态下,系统需要提供正告信息并且退出程序。
在实际开发中assert首要用于确保程序的正确性,通常在程序开发和测验时运用。为了进步运转功率,在软件发布后,assert查看默认是封闭的。
运用断语的几个准则:

  1. 运用断语捕捉不应该产生的非法状况。不要混杂非法状况与过错状况之间的差异,后者是必定存在的并且是一定要作出处理的。

  2. 运用断语对函数的参数进行确认。

  3. 一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐秘过错。当进行防错性编程时,假如”不可能产生”的工作的确产生了,则要运用断语进行报警。
    FreeRTOS 中的 configASSERT
    configASSERT是在FreeRTOS中的断语函数。假如断语函数的参数为0时将触发断语函数的履行。
    FreeRTOS的断语功用在调试阶段是十分有用的,能够有效地查看参数过错和运转中的过错,但在正式发布软件时,请将此功用封闭,由于断语功用会增加工程代码巨细并下降工程履行功率。封闭断语也比较简单,假如FreeRTOSConfig.h文件中有断语的宏界说,将其注释掉即可,假如没有宏界说,默认在FreeRTOS.h文件中就是封闭的。

    #define configASSERT( x ) if( x == 0 ) {taskDISABLE_INTERRUPTS(); for(;;); }

在运用调试器的状况下,一旦出现断语失败,会封闭中止,程序会死在这个for循环中,此时用户能够很简单就确定函数犯错方位。

其他

  1. %*c表示疏忽一个字符

  2. C++变量前面加下划线和不加下划线都不会影响对变量的界说,仅仅风格问题,更喜爱将成员变量或者私有成员变量的前面加上下划线。以表示该变量是某个类的特点。