ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

c语言常量、变量按照功能划分

c语言常量、变量按照功能划分 最近我在写stm32单片机的程序也阅读以前同事写的代码以及参考uboot内核源码、linux内核源码来编写。我现在的思路是分模块进行编程将整个项目分成一个个独立的模块每一个模块对应一个源文件和头文件在源文件和头文件中定义数据类型以及对应变量往往是全局变量使用宏定义对模块相关的恒定不变的常数进行编码然后根据子函数在父函数中的调用方式编写风格一、风格二、风格三这三种风格的函数。我在前面写的几篇文章中对三种风格函数定义选择进行了大量描述在这里就不再赘述了今天要讲解的重点是数据结构毕竟数据结构算法共同组成程序。数据结构我以前对数据结构认识是这样的定义自定义类型然后用这些类型定义全局变量自定义类型包括结构体类型、数组类型、共用体类型等不过我现在有了更深的认识那就是除了包含以上这些之外数据结构还要包含使用宏定义对常量进行编码以及原生类型定义的变量容易被遗忘定义的宏定义原生数据类型定义的变量也是属于数据结构。模块化编程过程就是用c语言对模块细节进行编写的过程。需要完成宏定义编码、函数定义、数据类型定义、数据类型变量定义原生数据类型和自定义数据类型这4大步骤4大步骤缺一不可。其中如果按照功能对数据结构变量、宏定义进行划分大致可以划分为两大类记录错误、状态旗标的常量或者变量记录真正有效数据的常量或者变量。任何一种常量或者变量按照功能划分都可以分成这2大类。常量记录错误状态旗标的常量记录真正数值的常量例如// 记录错误状态旗标的常量 #define DIR_FORWARD 1 #define DIR_BACKWARD 2 #define DIR_STOP 3 #define MOTOR_RUNNING 1 #define MOTOR_STOPPED 2 #define SUCCESS 0 #define FAILED 1 // 记录真实有效数据的常量 #define PI 3.1415926 #define LIMIT_CNT 2变量记录错误状态旗标的变量记录真正有效数据的变量例如// 记录错误状态旗标的变量 uint8_t motor_state; uint8_t motor_run_dir; uint8_t limit_state; // 记录真正数据的变量 ADC_HandleTypeDef hadc1; CAN_HandleTypeDef hcan1; TIM_HandleTypeDef htim6;记录错误状态旗标的变量主要用于记录程序或者模块“运行时动态状况”其值会随着程序执行流程频繁变化通常使用的类型为原生数据类型int boot、enum或小型结构体数值变更具有时序依赖性何时改、谁改很重要,该变量多用于“控制流程”。记录真正有效数据的变量用于存储程序运行所需相对稳定的信息资源通常作为多个函数共享的数据源或者配置基准。数据类型多为复合型struct、array、union、pointer,内容更倾向于信息载体而非控制流更接近于“共享资源”的概念。编写代码时“记录错误状态旗标的变量”容易被忽略掉也就是只记住定义真正有效数据的类型和变量以及函数而忽略这种经常使用原生数据类型记录错误状态旗标的全局变量这也是考虑细节不细致导致的。其他引伸不相关LSP:语言服务协议在vscode中大纲窗口中列表的变量或者函数是不区分声明或者定义的c语言中的修饰关键字extern、auto、static是无法在大纲窗口中显示的这是由于vscode软件要符合LSP协议要求协议中要求这些修饰类关键字不显示这样做也是为了满足支持多语言时的共性。函数名命名规范如果看过uboot源码、linux内核源码的话会发现大部分函数名都是由三个以内单词组成的。之所以这样保持在三个单词以内是因为函数名虽然表示一段话但是这段话不能太复杂太啰嗦如果发现3个单词无法将函数所要实现的含义表达清楚说明该函数还是太复杂了需要再分成多个子函数每一个子函数名由3个以内单词组成。函数名命名一定程度上也说明了函数需要完成的工作如果发现函数名无法清晰明了的由3个单词以内组成说明该函数组织不合理不太适合写成一个函数需要重新规划拆分成多个子函数让多个函数共同完成原函数实现的流程过程。
返回列表