C语言程序书写规范

简介: C语言程序书写规范我做C语言底层开发,积累了一些代码书写的经验供大家参考:1.C语言书写规范1.1符号命名规则

C语言程序书写规范

我做C语言底层开发,积累了一些代码书写的经验供大家参考:

1.C语言书写规范

1.1符号命名规则

1.1.1符号名包括模块名、常量名、标号名、子程序名等。这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解。命名采用匈牙利命名法。规则如下:

(1)所有宏定义、枚举常数和const变量,用大写字母命名。在复合词里用下划线隔开每个词。

(2)复合词中每个单词的第一个字母大写。除了规则5.1.1.1以外,避免使用下划线。

(3)类、类型定义和枚举型名的第一个字母大写。

(4)函数名是复合词的,第一个词采用全部小写,随后每个单词采用第一个字母大写,其它字母小写方式;如果是单个词的,采用全部小写方式。

(5)循环变量可采用i, j, k等,不受上述规则限制。

(6)类的成员变量应采用m_开头。

(7)全局变量词头为g_。

(8)临时变量词头为tmp_。

(9)对结构体内的变量命名,遵循变量的具体含义命名原则。

(10)用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。

表 1

词头类型

简写

词头类型

简写

char

ch

structure

st

long

l

ASCII string

sz

integer

i

byte

by

unsigned

u

short int

n

boolean

b

DWORD

dw

pointer

p

function

fn

double

d

handle x

hx

string

s

handle y

hy

表 2

词头变量名词

变量名

词头变量名词

变量名

task

task

semaphores

sm

watchdog

wd

timer

tm

mutual exclusion

mutex

Counting semaphores

sc

message

msg

pipe

pipe

例:

#defineARRAY_SIZE 24 /*规则5.1.1.1*/

intg_iFlag;

classMyClass /*规则5.1.1.3*/

{

};

voidsomeFunc( ) /*规则5.1.1.2和5.1.1.4*/

{

int nArray[ARRAY_SIZE];

unsigned char uchByte;

char szName[ ];

char *pszName = szName;

}

(11)有些词头(如p和u)可以和其它词头组合。

例:WDOG_ID wdId;

WDOG_ID g_wdId; /*全局watchdog Id,故以g_开头*/

1.1.2名字的长度一般不要过长或过短。过长的名字会增加工作量,使程序逻辑流程变得模糊;过短的名字无法表达符号的实际意义。约定长度范围:3-31

1.2数据和函数说明

1.2.1数据说明次序应当规范化,使数据属性容易查找,也有利于测试、排错和维护。说明的先后次序应固定,应按逻辑功能排序,逻辑功能块内建议采用下列顺序:整型说明、实型说明、字符说明、逻辑量说明。

1.2.2如果设计了一个复杂的数据结构,应当通过注释对其变量的含义、用途进行说明。

1.2.3在函数的声明中使用异常声明。

如:void f()throw(toobig,toosmall, divzero);

在声明一个函数时,将它所抛出的异常列出,便于函数的使用者了解可能会发生哪些异常。

1.3 程序注释

1.3.1程序注释是程序员与日后的程序读者之间通信的重要手段之一,注释分为文件注释、函数注释和功能注释。

1.3.2正规程序的注释应注意:

——注释行的数量占到整个源程序的1/3到1/2。

1.3.3文件注释位于整个源程序的最开始部分,注释后空两行开始程序正文。它包括:

——程序标题。

——目的、功能说明。

——文件作者、最后修改日期等说明。

例:

./********************************************************************

(空一行)

标题: Demo.c

功能: 测试VxWorks的各种系统调用.

说明:

该程序测试各种VxWorks的系统调用函数。包括任务(taks)的创建、挂起及任务间通过信号灯实现同步,通过消息队列进行通讯。

程序创建了两个任务:一个高优先级的任务和一个低优先级的任务。两个任务间通过一个二进制的信号灯进行同步,通过消息队列进行通讯。

当前版本: x.x

修改信息: 2000.06.05 John, Initial Version

2000.07.05 Tom,Bugxxxx fixed

**************************************************************/

(空2行,开始程序正文)

1.3.4函数注释通常置于每函数或过程的开头部分,它应当给出函数或过程的整体说明对于理解程序本身具有引导作用。一般包括如下条目:

——模块标题。

——有关本模块功能和目的的说明。

——调用格式

——接口说明:包括输入、输出、返回值、异常。

——算法。如果模块中采用了一些复杂的算法。

例:

file://(/注释开头应和上一函数空两行)

(注释开头与上一函数最后一行间隔两行)

/********************************************************************

标题:assignmentComplete

功能:BSC=>MSC消息生成函数,生成assignment_complete指配完成消息(BSMAP消息) .

格式:

intassignmentComplete(int iCellId, intiServiceChannnelNum, char *pszMSGData)throw(exception1, exception2)

输入:

intiCellId: MS所在的小区识别

iCellId取值:0x00-——0xff

intiServiceChannnelNum:MS所占的业务信道号码

输出:

char * pszMSGData:指配完成消息数据

返回值: 0x00正常

异常:exception1异常情况1, exception2异常情况2

********************************************************************/

( 注释后直接开始程序正文,不空行。)

1.3.5功能性注释嵌在源程序体中,用于描述其后的语句或程序段做什么工作,也就是解释下面要做什么,或是执行了下面的语句会怎么样。而不要解释下面怎么做,因为解释怎么做常常与程序本身是重复的。

例:

/*把 amount加到 total中*/

total =amount + total;

这样的注释仅仅是重复了下面的程序,对于理解它的工作并没有什么作用。而下面的注释,有助于读者理解。

/*将每月的销售额amount加到年销售额total中*/

total =amount + total;

1.4 函数编写应尽可能短小精悍,一般不超过两屏,以便于调试和理解。

1.5语句结构

为保证语句结构的清晰和程序的可读性,在编写软件程序时应注意以下几个方面的问题:

——在一行内只写一条语句,并采用空格、空行和移行保证清楚的视觉效果。

——每一个嵌套的函数块,使用一个TAB缩进(可以设定为4个空格),大括号必须放在条件语句的下一行,单独成一行,便于匹对:

如,有一段程序如下:

for(i=1;i<n-1;i++){t=1;for(j=i+1;j<n;j++){

if(a[j]<a[t]) t=j; if(t!=i){work=a[t];a[t]=a[I];a[I]=work;}}}

应写为

for( i=1;i<n-1; i++)

{

 t=1;

 for(j = i+1; j<n; j++)

 {

  if(a[i]<a[j])  

   t=j;

  if(t!=1)

  {  

   work=a[t];

   a[t]=a[i];

   a[i]=work;

  }

 }  

}

——文件之中不得存在无规则的空行,比如说连续十个空行。

一般来讲函数与函数之间的空行为2-3行;

在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。

——程序编写首先应考虑清晰性,不要刻意追求技巧性而使得程序难以理解。

——每行长度尽量避免超过屏幕宽度,应不超过80个字符。

——除非对效率有特殊要求,编写程序要作到清晰第一,效率第二。

——尽可能使用函数库。

——尽量用公共过程或子程序去代替重复的功能代码段。要注意,这个代码应具有一个独立的功能,不要只因代码形式一样便将其抽出组成一个公共过程或子程序。

——使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。如将 x=a*b/c*d写成 x=(a*b/c)*d可避免阅读者误解为x=(a*b)/(c*d)。

——避免不必要的转移。

——避免采用过于复杂的条件测试。

——避免过多的循环嵌套和条件嵌套。

——建议不要使用 *=,^=, /=等运算符。

——一个函数不要超过200行。一个文件应避免超过2000行。

——尽量避免使用go to语句。

——避免采用多赋值语句,如x = y = z ;

——不鼓励采用?:操作符,如z = (a>b)?a:b;

——不要使用空的if else语句。如

if(cMychar>= ‘A’)

if(cMychar<= ‘Z’)

printf(“Thisis a letter /n”);

else

printf(“Thisis not a letter /n”);

else到底是否定哪个if容易引起误解。可通过加{}避免误解。

——尽量减少使用“否定”条件的条件语句。如:

把 if( !( (cMychar<’0’)||(cMychar>’9’) ) )

改为if((cMychar>=’0’)&& (cMychar<=’9’) )

11年前的一篇博文,重新整理了下,可借鉴的地方很多!

相关文章
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
102 1
|
3月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
127 1
|
3月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
155 0
|
6月前
|
存储 C语言
简单c语言程序举例
简单c语言程序举例
83 1
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
2月前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
95 10
|
3月前
|
自然语言处理 编译器 C语言
C语言程序的编译
C语言程序的编译
65 2
|
4月前
|
前端开发 C语言 C++
C语言03----第一个程序HelloWorld(vs版)
C语言03----第一个程序HelloWorld(vs版)
|
5月前
|
C语言 图形学 C++