函数返回值的作用(代码流水线思维)以及变量声明的一些说明

📅 2026/7/29 18:15:00
函数返回值的作用(代码流水线思维)以及变量声明的一些说明
最近我在看以前同事写的stm32单片机的程序由于单片机程序尤其是应用层的程序不涉及到协议栈代码量不会太大通常是比较简单的实现的功能少很多因此前同事写代码的时候大量使用了全局变量用于记录函数调用的结果当我读到这些函数的时候感觉不太适用因为在函数中大量直接读写全局变量与我在linux内核中看到的那种写法不太一样于是我在脑中记录想到linux内核源码的写法也就是函数定义的时候有返回值用于记录函数调用的结果这种写法更符合“代码流水线思维”可以将函数返回值直接给调用的的父函数如果函数调用级数非常多就可以形成类似“流水线”的操作而且更加灵活返回值可以在调用函数父函数中直接赋值给全局变量也可以直接赋值给调用函数父函数内部的变量。现在让我们仔细整理一下这两种方式。1方式一定义了一大堆全局变量函数定义的时候往往返回值为“void”类型也就是不需要返回值在函数内部将代码运行的结果存储在事先定义好的全局变量中。2方式二也定义了一些全局变量不过比方式一要少很多函数定义的时候定义返回值类型而非“void”类型也就是函数内部代码运行的结果作为返回值在函数运行完后作为返回值传递给调用本函数的父函数中的“全局变量或者内部栈变量”这也是函数定义三要素中返回值类型的意义所在。返回一个返回值用于基于代码运行结果或者状态或者flag旗标从项目代码整体看代码运行一小段产生了某个结果或者中间数据代码---数据的过程动作---结果的过程。比较看方式二的函数代码编写方式更优秀更符合“代码流水线”思维只需定义少量全局变量在最初父函数操作那个全局变量剩余数据属于各个子函数内部栈变量而且更适合复杂度更高的项目编写代码可移植性更好写出的代码冗余性更低。全局变量声明大家都知道全局变量或者API全局函数只有一次定义可以有N次声明全局变量声明的时候使用extern关键字API(全局)函数声明的时候extern可以省略。如果在一个源文件内部使用另外一个源文件中定义的全局变量有两种办法一种直接使用extern 变量类型 变量名这种方式另外一种就是把全局变量声明写到某一个头文件中如果需要调用全局变量首先在源文件中使用include包含头文件源文件在预处理器的作用先会将头文件中内容原地展开最终结果与直接使用全局变量声明是一样的。今天重点说明的是数据全局变量的声明我们知道数组定义的时候要么显式或者隐式的定义数组元素个数那么就有一个问题了数组这个全局变量怎么声明呢数组元素个数需要写吗答案是否定的数组定义的时候是需要标明数组元素个数数组声明的时候不需要标明元素个数例如 extern uint8_t array[];我问过AI也不建议在声明中标明数组元素个数也就说标明数组元素个数几没必要也更不好。因此全局变量声明的时候不要写数组元素个数从编译器角度考虑变量声明的意思是告诉编译器全局变量假设已经定义在其他源文件中链接的时候自己去找编译器关心的是数组名是什么而不关系也无法关系里面有几个元素。那么如何获取数组元素个数呢那只能再声明另外一个普通变量例如extern uint8_t array_cnt这种方式结合起来声明了全局数组以及全局数组元素个数。值得注意的是如果有多个数组需要声明可以和定义数组变量时一样只使用一个extern 数组元素类型 数组1数组2如下所示extern uint8_t cmd_rxbuf[], cmd_txbuf[]; extern uint8_t cmd_rxlen, cmd_txlen;这样写相当于一行代码声明了2个全局数组写起来更加间接。