专栏首页嵌入式学习常见的C语言编程规范

常见的C语言编程规范

头文件:

1.头文件中适合放置接口的声明,不适合放置实现。

2.头文件应向稳定的方向包含,产品依赖于平台,平台依赖于标准库。

3. .c/.h文件禁止包含用不到的头文件。

4.每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口。

5.禁止头文件循环依赖。

6.头文件应当自包含(任意一个头文件均可独立编译)。

7.禁止在extern"C"中包含头文件。

8.禁止在头文件中定义变量,如果头文件被其他文件包含,会引发重复定义。

9.只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量。

10.如果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名,降低接口使用者的编写难度。

编码:

1.函数不变参数使用const。

2.全局变量应增加“g_”前缀。

3.静态变量应增加“s_”前缀。

4.在源文件范围内声明和定义的所有函数,除非外部可见,否则应该增加static关键字。

5.通讯过程中使用的结构,必须注意字节序。对于跨平台的交互,数据成员发送前,都应该进行主机序到网络序的转换;接收时,也必须进行网络序到主机序的转换。由于位域在不同字节序下,表现看起来差别更大,所以更需要注意。

6.函数调用不要作为另一个函数的参数使用,否则对于代码的调试、阅读都不利。

7.函数break,return时一定要注意资源的释放,比如释放申请的内存、释放锁。

8.禁止内存操作越界。

坚持下列措施可以避免内存越界:

 (1)数组的大小要考虑最大情况,避免数组分配空间不够。

 (2)避免使用sprintf/vsprintf/strcpy/strcat/gets操作字符串,使用相对安全的函数

snprintf/strncpy/strncat/fgets代替。

(3)使用memcpy/memset时一定要确保长度不要越界。

(4)字符串考虑最后的'\0',确保所有字符串是以'\0'结束。

(5)指针加减操作时,考虑指针类型长度。

(6)数组下标进行检查。

(7)使用时sizeof或者strlen计算结构/字符串长度,避免手工计算。

9.禁止内存泄漏。

坚持下列措施可以避免内存泄漏:

(1)异常出口处检查内存、定时器/文件句柄/Socket/队列/信号量/GUI等资源是否全部释放。

(2)删除结构指针时,必须从底层向上层顺序删除。

(3)使用指针数组时,确保在释放数组时,数组中的每个元素指针是否已经提前被释放了。

(4)避免重复分配内存。

(5)小心使用有return、break语句的宏,确保前面资源已经释放。

(6)检查队列中每个成员是否释放。

10.禁止引用已经释放的内存空间。

坚持下列措施可以避免引用已经释放的内存空间:

(1)内存释放后,把指针置为NULL;使用内存指针前进行非空判断。

(2)耦合度较强的模块互相调用时,一定要仔细考虑其调用关系,防止已经删除的对象被再次使用。

(3)避免操作已发送消息的内存。

(4)自动存储对象的地址不应赋值给其他的在第一个对象已经停止存在后仍然保持的对象(具有更大作用域的对象或者静态对象或者从一个函数返回的对象)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 单片机开发之C语言编程基本规范

    为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。本标准规定了程序设计人员进行程序设计时必须遵循的规范。本规范主要针对单片机编程语言和0...

    用户4645519
  • 在cubemx中使用freertos中的注意事项

    而且在中断中发送信号量或队列的时候,务必把使能中断的语句放在初始化freertos之后,尤其是cubemx生成的代码,默认是把中断初始化放在freertos初始...

    用户4645519
  • 51单片机汇编程序实例一

    已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=aaH. ORG 0000H MOV A, #02H MOV 51H, #0x...

    用户4645519
  • C语言编程规范

    C是一门朴素的语言,它是大部分程序员的入门语言,那么C语言的常见编程规范都有哪些呢

    闫小林
  • 算法:二叉排序树的删除节点策略及其图形化(二叉树查找)

    二叉排序树(BST,Binary Sort Tree)具有这样的性质:对于二叉树中的任意节点,如果它有左子树或右子树,则该节点的数据成员大于左子树所有节点的数据...

    s1mba
  • 我所了解的Facebook的架构

    Web前端使用PHP。Facebook的HipHop编译器会将它们转换成C++然后使用g++编译,这样就提供了一个高性能的模版和web逻辑执行层。 由于完全依赖...

    春哥大魔王
  • java IO流之二 使用IO流读取存储文件

    http://blog.csdn.net/a107494639/article/details/7586440

    bear_fish
  • Go Echo Web Framework

    Echo是Go语言生态里的一个Web应用框架,这个框架提供了非常非常简单的方式来开发高性能的Web应用。其实在写Echo之前,还想说一说Go语言里一个非常有意思...

    icepy
  • 节约内存:Instagram的Redis实践

    可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Instagram团队如何使...

    后端技术探索
  • Linux命令行小贴士

    本文内容需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费...

    水门

扫码关注云+社区

领取腾讯云代金券