c语言编码风格,讲嵌入式C语言编码风格.ppt

讲嵌入式C语言编码风格

目 录 简介及说明 语言规则 1.基础 2.数据 3.说明与表达式 4.函数 5.内存及资源 6.源文件 风格指导 7.程序书写 8.命名 9.文档 简介及说明 正确性 易维护性 易移植性 代码的高效性 语言规则——基础 编写清晰表达设计思路和意图的代码 针对易读来优化代码, 效率优化留给编译器去做 编写可大声朗读的代码 利用注释阐述和解释代码,并进行总结 使用有意义且无歧义的命名方法.(推荐使用全英文的命名) 尽可能使用标准C 函数 不将同样的代码使用三次以上, 编写相应的函数 让程序自己检查运行中的错误-编写调试代码 谨慎使用GOTO语句 不要修补那些风格差的代码,重写他们 不要比较两个浮点数是否相等 优化代码或调试一旧版本前,备份并记录所做的修改 避免机器及编译器相关的代码,如必需,隔离相关代码 将编译器设为最高警告水平,把每一个警告视为错误来处理 不要直接在程序中直接书写常量,应该使用常量的宏定义 #include 的头文件没有被引用 在同一个编译单元内(一般是一C文件)重复引用同一头文件 在头文件内说明却仅仅在一个C文件中引用 全局变量仅仅在一个C文件中引用. (应该使用static 量) 在赋值中,左右两边的数据类型不一样. (如确实必须,应该显式地进行类型转换) 函数返回指向函数内说明的自动变量的指针. (应该使用指向static 变量的指针) 删除switch case 语句中的break语句(除非两个或多个case的处理代码是完全一致的, 这时应该加以注释。) 两个不同类型指针间的运算 隐含的数据类型转换 隐含的对于变量是否为0的测试 比如: “if (a = b)” ; 正确的写法是 “if ( (a = b ) != 0)” 缺少default 的switch 语句 表达式中假设了运算顺序 (不要怕写括号) 忽略函数的返回值, 如果函数不需要返回值可使用 (void) f(); 但如果程序中无 返回值函数的数量太多,则系统的设计可能有问题 模块间的依赖关系对于开发效率,可测性,可维护性都有很大的影响. 良好的依赖关系应该是简单的,层次化的,和非循环的. 函数间传递的参数越少越好,减少模块件的依赖关系和耦合程度,最大程度上实现对模块的封装,将模块内的复杂性屏蔽,而对外提供简洁的数据接口。 尽量减少全局变量的使用,局限在一个c文件中的全局变量应该说明为 static。 对于一组在逻辑上相关的变量,应该尽量将他们封装在结构中。 推荐使用 typedef 来进行数据类型的说明。 所有不同类型变量间的运算,必须显式地进行类型转换。(这一点对于不同类型的指针间运算尤其重要) 对于没有加 unsigned 修饰的类型, 应该小心处理可能的数据溢出 在程序( 函数或c文件 )的开始处对变量进行说明, 将相关的变量说明放在相邻的行 变量的说明应该遵循一个变量一行的原则, 除非所说明的变量是紧密相关的 将不变的变量说明为 const 尽量在变量的说明行中对变量进行初始化 避免不必要的全局变量 什么时候使用指针? 该变量在其有效期内可能表示不同的对象. 该变量表示一个任意的关系, 也即其可能为空. 使用指针可能有更高的效率(关键代码中)或更好的实现 避免无效的指针 假设任何指针都可能为空 使用NULL来比较指针,而不是0,仅有指针才会拥有NULL值 使用NULL 来表示指针不指向任何对象;使用 0x0 表示数值零; 使用 ’\0’表示字符串的结束. 只有在没有更好的变通情况下使用GOTO 语句 确保数组的存取没有越界 假设所有的临时变量再使用完毕后就被立刻清除 所有函数的入口参数都必须进行合法性检查 函数间的接口越简洁越好, 参数传递应该尽可能的简单 理想的函数应该仅有一个统一的返回点(出口) 对于某个具体的项目而言, 函数应该拥有尽量统一的返回值约定 函数的调用者应该检查函数的返回值 过深层次的嵌套调用应该充分考虑系统或该进程的堆栈大小, 防止堆栈溢出 每个函数前必须有相应的说明 所有函数的返回类型必须显式的定义, 没有返回值的函数应该说明为void 函数前必须有相应的说明-范例 /********************************************************* *FUNCTION NAME :test_func * *ARGUMENT: *in_arg1: brief description of the argument *in_arg2: brief description of the argument *in_arg3:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Gradle引导旧式Ant构建

Gradle提供了几种不同的方式来利用您现有的对Ant的投资,包括积累的知识和您已经放入构建文件中的时间。 这可以极大地方便将Ant生成的项目移植到Gradle的过程,并为您提供逐步进行此操作的路径。 Gradle文档在描述如何在Gradle构建脚本中使用Ant方面做得很…

实现chrome扩展启动本地进程 - 补充

实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报分类:Chrome Plugin版权声明:本文为博主原创文章,未经博主允许不得转载。 示例 主要包含如下部分 c…

SpringMVC整合MongoDB

首先&#xff0c;在pom文件中新增spring-data-mongodb的依赖&#xff1a; <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.8.1.RELEASE</version>&l…

单路电压表c语言编程,用AT89C51单片机制作的数字电压表

此数字电压表&#xff0c;利用A/D转换原理将被测模拟量转换成数字量&#xff0c;并通过控制系统用数字方式显示测量结果。本设计采用AT89C51单片机&#xff0c;ADC0809进行模/数转换&#xff0c;能够测量8路0&#xff5e;5V的输入电压值&#xff0c;可用四位LED数码管轮流或单路…

ZK的实际应用:MVVM –加载和渲染数据

先前的文章简要介绍了RIA框架ZK&#xff0c;以及它CSS Selector启发式控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担。 然后&#xff0c;我们在上一篇文章中探讨了ZK中的MVVM模式如何允许单个ViewModel提供不同的视图。 这篇文章…

搭建一个简单的mybatis框架

一、Mybatis介绍 MyBatis是一个支持普通SQL查询&#xff0c;存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的POJO&#xff08;Pla…

定时操作范例

1 package timetask.demo;2 3 import java.text.SimpleDateFormat;4 import java.util.Date;5 import java.util.Timer;6 import java.util.TimerTask;7 8 /*9 * time类 是一个线程实施&#xff0c;可以用来实现在某一个时间或者某一个时间段后安排某一个任务执行一次或者定期…

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思&#xff1a;都是转义字符&#xff0c;空格就是单纯的空格&#xff0c;输入时可以输入空格\t 跳格 \r 回车 \n 换行\\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。转义字符串(Escap…

如何在运行时更改日志记录级别

在运行时中更改日志记录级别很重要&#xff0c;这主要在生产环境中非常重要&#xff0c;在生产环境中&#xff0c;您可能希望在有限的时间内进行调试日志记录。 好了&#xff0c;更改根记录器非常简单–假设您有一个具有所需记录级别的输入参数&#xff0c;只需获取根记录器并…

扩展中国剩余定理

转自&#xff1a;http://blog.csdn.net/clove_unique/article/details/54571216 对于两个方程$x\equiv c_1\pmod {m_1}$$x\equiv c_2\pmod {m_2}$将其合并为一个方程&#xff0c;有解条件为$(m1,m2)|(c2-c1)$$m\frac{m1m2}{(m1,m2)}$$c(inv(\frac{m1}{(m1,m2)},\frac{m2}{(m1,m…

易语言添加ctrl c键,易语言操作快捷键汇总

以下是关于易语言的快捷键内容&#xff1a;预览被设计窗口 CtrlEnter运行 F5终止运行 CtrlF5编译 F7菜单编辑器 CtrlE即时帮助 F1在编辑窗口之间跳转。按下 Ctrl 键后不放&#xff0c;然后反复按 Tab 键可以在目前所有的编辑窗口之间跳转&#xff1b;按下 Ctrl 键后同时按下 Ta…

在代理类中引用动态代理

在Stackoverflow中有一个有趣的问题 &#xff0c;关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务&#xff0c;Spring AOP&#xff0c;缓存&#xff0c;异步流等。需要对代理的引用&#xff0c;因为如果存在对自身的调用通过代理bean&#xff0c;此调用将完全…

Array的用法总结-swift

Araay是有序的数据集&#xff0c;在OC中分为不可变数组NSArray和可变数组NSMutableArray&#xff0c;在swift中只有常量和变量两种类型&#xff0c;声明成变量那就可以说明是可变的了&#xff01; 学习时的具体的用法总结成如下的代码&#xff1a; //数组var arrInts [Int]()/…

Frame URl

http://www.zi-han.net/theme/hplus/?v4.1 http://webapplayers.com/inspinia_admin-v2.5/ http://baijunyao.com/article/67 转载于:https://www.cnblogs.com/shijiaoyun/p/6065755.html

linux的i o模型,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件)&#xff0c;对一个文件的读写操作会调用内核提供的系统命令&#xff0c;返回一个file descriptor(fd&#xff0c;文件描述符)。而对一个socket的读写也会有响应的描述符&#xff0c;称为socket fd(socket文…

handsontable 方法汇总

核心方法1.为handsontable添加钩子方法 addHook(key,callback):key为钩子方法名 例如&#xff1a;hot.addHook(beforeInit, myCallback); addHookOnce(key,callback)&#xff1a;添加只使用一次的方法&#xff0c;用完后自动删除 例如&#xff1a;hot.addHookOnce(beforeInit, …

swing中JTable的使用方法

1 public static void main(String[] args) {2 3 Student s1 new Student("张三", "001", 0);4 Student s2 new Student("李四", "002", 1);5 Student s3 new Student("王五", "003",…

android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

原标题&#xff1a;Android 仿高德地图可拉伸的BottomSheet2018安卓巴士开发者大会-上海站你一直期待的安卓技术盛宴即将登场&#xff01;前言最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控件。而我看到这个效果图&#xff0c;觉得这个就是一个slidingpanel&#…

Java EE 7中包含哪些JSR?

我开始填写所有应该加入Java EE 7的Java规范请求的表。 由于平台版本仍在确定中&#xff0c;因此某些细节很难确定。 完整的Java EE 7 EJB产品具有以下标准组件和API&#xff1a; 名称 版 描述 JSR 网页 轮廓 批处理 1.0 批量处理 352 Bean验证 1.1 Bean验证框…

[ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

作为入门者来说。了解JavaScript中timer的工作方式是非常重要的。通常它们的表现行为并非那么地直观&#xff0c;而这是由于它们都处在一个单一线程中。让我们先来看一看三个用来创建以及操作timer的函数。var id setTimeout(fn, delay); - 初始化一个单一的timer&#xff0c…