嵌入式开发常用技巧及CC++知识

嵌入式开发常用技巧及CC++知识,第1张

嵌入式开发常用技巧及C/C++知识
  • 引言
    • static 静态变量
    • ‘##’连接符
    • 断言函数
    • 其他
  • 后续

引言

我们在日常的嵌入式开发中,经常会遇到各种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++变量前面加下划线和不加下划线都不会影响对变量的定义,只是风格问题,更喜欢将成员变量或者私有成员变量的前面加上下划线。以表示该变量是某个类的属性。

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的项目实战专栏和软硬结合专栏。
欢迎关注公众号了解更多。

编写不易,感谢支持。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1498280.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存