这部分是讲一下在使用HAL库中学到的比较有用的高级C
/*************************************************************************************************/
1.枚举
枚举的便利在于限定参数的选值只可能是已定义的枚举类型,默认为0,可以自己赋值,没有赋值的
自动在赋值之后递增1;这些简单的自己百度一下吧
本来我只是知道这个东西并不是很熟练的会使用,但自从张P跟我说之后还是很不懂
有个大概的概念吧,现在看过HAL库中的枚举的使用,然后自己动手玩了下,感觉蛮有意思
首先声明,枚举是真正的常量,并不是所谓的Const,既然说到这里了就说下Const,它只是只读变量
并不真的是常量,对于一般变量,只有变量赋初值能改变变量的值对于加了Const的,其他情况下都只能
读变量的值。
然后吧,关于枚举需要注意以下几点,
1.大括号里面是常量,并不是变量,所以并不需要定义变量
2.每个常量之后要用逗号,而不是分号,否则编译通不过
3.最好在最后面一个常量后加一个分号
4.定义枚举类型的时候用的是大括号外面的逗号前面的那个变量,定义出来的枚举类型的值
只可能是括号里面的值否则会报错。
5.枚举多用来作返回值或者是限定参数
typedef enum
{
HAL_OK,
HAL_ERROR,
}Enum_Typedef;
Enum_Typedef A ;(A的值只可能是HAL_OK或者是HAL_ERROR)
/*************************************************************************************************/
2.关于防御性编程
这个之前就提到过,外国的程序员经常用他们的30%时间来进行防御性编程,我们这边关心的
只有功能是否实现,至于程序的健壮性以及可靠性关心的不是很多,但是看了下HAL库中的代码
感觉好多都是在进行防御性编程,各种错误机制都做的挺棒,本来很简单的代码把那些Handler
去除之后发现就差不多几行有用的代码,比如一个函数首先要对传递过来的参数进行参数的合法性检查
在标准C里面是assert函数,在IAR中对assert进行扩展了,代码如下,简单做下解释
这个宏就是说如果满足条件的话就什么也不做,如果不满足条件的话就有error打印出文件和行号
可以说是非常方便,我们用的时候只需要自己再写个宏判断是不是限定的几个参数之一,然后把参数
传进去就完成参数的合法性检查。
#ifdef USE_FULL_ASSERT
/**
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
* @retval None
*/
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_
14.关于HAL库中的高级C
最新推荐文章于 2024-07-08 19:49:20 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)