最近,我在写stm32单片机程序,发现stm32的HAL库中写的代码有很多省略写法,我这里说的省略写法不是指HAL库中烧了什么函数的意思,毕竟HAL库的代码水平还是很高的,有很多值得我们学习的地方。我说的省略写法是指在函数内部有些临时栈变量用于接收某个函数的返回值,或者某个中间变量,在编写代码过程中省略了,今天要讨论的是这种省略临时栈变量或者中间变量的写法,什么时候是可以省略的,什么情况是不能省略的。

首先,这种省略写法的好处就是提高代码在某一行的有效占比,毕竟某一行的空白区域越小,有效代码含量越高,这一行的代码质量也越高;相对的,如果每一行空白区域或者留白区域过多,这一行代码质量就越低。

因此在很多函数编写中,例如在if(条件判断)中,直接调用某一个函数,然后直接进行比较,这样这一行的代码空白区域就很少,代码质量就很高,例如:

if (ApplyCalibration(&data) != ERR_OK)
{
    return xxx;
}

但是上述代码有个问题返回值xxx,我是想使用它的,但是如果这样的省略写法(省略定义一个临时栈变量 uint8_t ret,去接收函数AppCalibration()运行的结果)是无法得知返回值到底是什么的,因此这种省略写法是行不通的,需要修改成这样:

uint8_t ret = ApplyCalibration(&data);

if (ret != ERR_OK)
{
    return ret;
}

我们分析两种写法的区别,找出需要定义临时栈变量的原因是什么?

可能有人是函数ApplyCalibaration(&data)的返回值是一个变动的元素,变动的元素如果需要描述的话,就需要定义某一个变量,因此需要定义uint8_t ret去接收函数ApplyCalibration(&data)的返回值。

我想说这种说法是错误的,第一种省略写法中函数直接调用也形成一个隐式可变元素,也是一个隐式变量,只是没有和第二种写法一样,显示的写出来罢了。

我的答案是:不能使用省略写法,函数内部需要定义临时栈变量的依据是这个变量是否被“读操作”至少2次以上。如果只有一次“读操作”,为了提高代码质量,完全有必要不定义临时栈变量,这样还能少一次栈内存申请,提高代码运行效率;相对的如果有至少两次或者以上“读操作”的发生,那必须要定义临时栈变量,而且也没有其他更加有效的办法,毕竟不能再调用一次函数吧,因为函数调用也是很耗费CPU资源的。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐