最近我在写stm32的单片机程序当然也参考其他同事写的代码我发现其他同事在写stm32单片机程序他也是分模块编写的每一个模块对应一对头文件和源文件我发现每一个模块内部定义的函数如果按照风格上划分可以划分成3种风格1没有返回值的函数风格2返回值为函数计算结果的函数风格3返回值为错误码的函数。我前端时间编写了结果模块的函数完全是按照风格3来编写的也是分模块进行编程每一个模块也对应一对源文件和头文件在头文件中每一个模块都定义各自的一套错误码源文件内部定义的每一个函数的返回值都是uint8_t类型的以错误码作为返回值来追踪记录函数内部在函数运行阶段的返回值。我现在有一个疑问这三种函数编写风格之间的关系是怎样的是否风格3是最完美的编写方式我后面的代码是否都应该按照风格3这种每一个模块定义错误码组然后定义的每一个函数返回值都是错误码来编写代码呢我以前任务风格3代码编写方式是最优秀的编写代码不能使用风格1和风格2的方式来编写因为风格1、2写的代码有漏洞。但是现在想想我这种想法是完全错误的我现在的答案三种风格各有千秋不是互斥关系而是哪种风格更适合选择来编程的关系。我们来总结一下三种风格的特点。风格1模块化编程一对头文件和源文件不定义模块对应错误码组函数返回值往往是void类型风格1编写的代码函数调用100%成功不存在失败或者其他错误情况也不用指导后面代码运行是最简单也是最常用的的函数编写风格。风格2模块化编程对应一对头文件和源文件函数返回值为函数运行的结果函数返回值类型往往为c语言原生支持的类型或者某种类型指针类型。风格2编写的函数在父函数中被调用也是100%成功不存在失败或者发生其他错误的情况但是它的返回值不是错误码而是函数运行的结果从函数的本质就是一个数据处理器角度出发这个返回值用于参与父函数后面代码编写。风格3模块化编程一对头文件和源文件头文件中定义模块对应错误码组函数返回值为uint8_t类型记录函数运行的错误码参数列表中使用输出型指针参数方式输出结果函数被父函数调用在运行阶段不一定100%成功存在失败或者遇到其他错误的情况函数返回值为某种错误码在父函数中参与指导父函数后面代码编写。三种风格函数细节评估风格1最主要特点就是简单也是使用最广泛的函数编写风格。因为没有定义模块特有的错误码也没有运行结果函数返回值直接是void(不用关系)因此函数编写的时候更加间接快捷这也是风格1的编写方式在单片机、嵌入式编程中得到广泛应用的原因。因为返回值为void类型因此无法将返回值传递给某一个变量或者直接参与if条件判断只能在父函数内部以简单函数调用方式实现调用。当然风格1的代码也不是全是优点没有缺点它无法通过返回值方式记录函数内部运行的情况因此风格1函数编写方式默认函数运行都是成功的不会有失败或者其他异常情况。风格2风格2的特点是编写的代码的返回值为函数运行的结果函数定义的时候返回值类型不一定是uint8_t而是根据函数内部数据处理最终结果的类型来作为函数返回值类型的。例如uint32_t、char *、void *、float、short、uint62_t等但是返回值类型为c语言本身支持的原生数据类型而不能是数组、结构体、共用体等自定义数据类型因为return关键字只支持原生数据类型数据返回。风格2编写的函数与风格1编写的函数的相同点是两种风格在父函数中被调用都是100%成功的不同点是风格2编写的函数在父函数中被调用的返回值用于参与指导后面代码编写。风格2编写的函数与风格3编写的函数的相同点就是在父函数中被调用的返回值参与指导后面代码编写不同之处在于风格2编写的代码是100%成功的而风格3编写的代码不能保证100%成功而且返回值的属性不同风格2函数返回值为运行结果风格3函数返回值为错误码。风格3当有些函数运行不可能100%完全成功存在失败地可能调用它的父函数需要知道函数内部运行情况函数内部运行情况以返回值的方式需要参与运算或者指导后面代码编写这个时候就需要定义带有返回值的函数也就是风格3的编写方式。风格3编写方式需要搭配定义一套针对所在模块特有的错误码组才能完成编写风格3编写方式写出的代码的返回值有为这些错误码中的一种并且这些错误码会参与后面的运算或者比较。因此风格3写出代码也是必不可少的一种编写方式在函数编写过程中也是存在的只是相对风格1、2编写方式使用的少。风格3的缺点就是父函数调用风格3写的函数存在一定难度尤其是父函数也是以风格3方式编写的函数这个时候就要特别注意模块与模块之间错误码映射关系千万不能混用模块的函数的返回值只能是该模块的错误码不能够是其他模块的。总结三种函数编写风格之间是并列的不是排斥关系。是根据场景哪种风格更适合用来完成代码编写的选择关系。风格1的函数编写风格定义的函数运行100%成功不存在失败的情况。风格2的函数编写风格定义的函数运行100%成功不存在失败情况返回值为函数作为数据处理器运算的结果不一定为uint8_t类型而可能是其他c语言原生支持类型返回值为运算结果用于指导后面代码编写。风格3的函数编写风格定义的函数运行可能不一定成功有可能失败的情况返回值为错误码指导后面代码编写。有些场景适合风格1有些场景适合风格2有些场景适合风格3在代码编写过程中都会遇到也都有机会采用用于编写函数三种函数编写风格是并列关系在编写代码过程中要认真思考那种风格更适合拿来定义函数具体情况具体选择不能强制都用哪种风格来统一编写所有函数这种想法错误的也是不现实的。