如何写出好的C代码

简介:



如何写出好的C代码


总的来说,评价代码好坏的标准万变不离其宗,主要包括如下几个方面:

稳定性:在不同的负载和应用场景下,都能得到正确的输出,性能也没比较大的抖动

健壮性:考虑到各种corner cases

鲁棒性:错误的输入、配置、异常或故障不会扩散到其他(更多)的模块

可扩展性:上下层模块之间有固定的接口,横向模块之间低耦合

易维护程度:可读性强,准确且足够的注释,便于调试,容易测试和调试


根据最近的编程心得,个人认为可有从下面的两个方面进行考虑:


1、明确需求和接口,选好算法和数据结构

开始编程之前,可用需求定义、层次划分、模块设计、接口定义先行,不需要快速实现C代码,可以先分层、划分好子模块,确定好具体的算法和架构后,先大致定义出头文件,并且在头文件中用注释的方式快速描述、确认头文件中各个接口函数的输入、输出参数,以及前提假设、临界条件。


2.利用已有的编码经验教训,使用静态和动态工具检查

下面列出了许多常用的C 编码规范,可供参考和检查:

  • 头文件中 #ifndef XXX; #define XXX;#endif 用来防止重复应用;


  • 考虑进对 C++的支持;extern "C"


  • 使用严格定义的数据类型:用uint8_t; uint32_t, uint64_tsize_t等代替char/int/short/long


  • indent 统一格式;


  • 编译时打开所有警告: -Wall


  • splint做安全和稳定性检查;


  • 封装容易出现问题的alloc();free();ralloc();realloc()


  • 甄别错误和异常情况,在调试版代码中使用 assert(), assert_perror(),并且保证在正式release中去掉。


  • 调试版本总考虑用不同的代码/算法确保核心代码;


  • 测试代码和功能代码并行进行,并且尽快搭建针对所开发模块的自动测试框架;

  • 利用GDB进行代码走读


    走读过程中碰到的&& /||/ ? :操作符号,可先打印出当前的状态,然后可以通过gdb来确认或者修改 将走到的路径


  • 避免getchar(), mallocate()这类返回值既可能表示运行正确与否,又能表示具体数值或地址相关的函数定义或实现,如果基础库的代码中有它,尽量避免它;如果设计的库函数中有它,尽量通过返回flag的方式来说明它。


  • 尽量避免用地址比较作为判断退出循环的条件,因为地址不确定,存在上溢或者下溢的可能;


  • 精确地实现而非近似地实现功能或者函数


  • 注意下溢或者上溢:


    下溢: short i; i = -i; (当i=-32768时, short - i)还是-32768)


  • 不要通过移位来替代除法以赚取一点微小的性能优化,因为这样会牺牲代码的清晰度

























  • 本文转自存储之厨51CTO博客,原文链接: http://blog.51cto.com/xiamachao/1744247
  • ,如需转载请自行联系原作者
相关文章
|
7月前
|
自然语言处理 安全 测试技术
如何写出优秀的代码
如何写出优秀的代码
|
1天前
|
编译器 Linux C语言
C语言:预处理详解(知识点和代码演示)
C语言:预处理详解(知识点和代码演示)
|
4月前
|
设计模式 算法 程序员
如何写出好的代码注释?
作为程序员,想必大家在日常开发中必写注释,而且在软件开发过程中,给代码写注释是一项至关重要的工作,也是一名合格的程序员该具备的编程素养。恰当的注释可以提高代码的可读性和可维护性,方便其他人理解熟悉和修改代码,但是不恰当或过度的注释可能会导致混乱和误导,会起到适得其反的作用。那么本文就来分享一些关于如何正确地给代码写注释的方法和指导原则,并提供一些减少注释但仍能让他人理解代码的方法。
67 3
如何写出好的代码注释?
|
10月前
|
自然语言处理 C++
【C++知识点】预处理命令
【C++知识点】预处理命令
96 0
|
10月前
|
存储 程序员 编译器
C语言——如何写出好的代码?
C语言——如何写出好的代码?
77 0
|
11月前
|
编译器 C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
|
11月前
|
C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
|
11月前
|
存储 自然语言处理 程序员
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
|
算法
如何写出高质量的代码注释
在软件开发中,代码注释是一个至关重要的部分。它们可以使代码更容易理解、更易于维护和调试,并帮助团队合作。但是,注释也可以容易被滥用或者过度使用,导致代码变得混乱或者难以理解。因此,写出高质量的代码注释是一项关键的技能,本文将分享一些有用的建议。
81 0
|
C语言
C语言——扫雷1.0(详细分析代码及思路)
C语言——扫雷1.0(详细分析代码及思路)
141 0
C语言——扫雷1.0(详细分析代码及思路)