python培训吧 关注:1,576贴子:8,662
  • 0回复贴,共1

浅谈C语言编程规范

只看楼主收藏回复


编程规范
编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。这是总则。
但很多人忽略了可读性、可移植性和健壮性(可调试的方法可能各不相同),这是不对的。
1.当项目比较大时,最好分模块编程,一个模块一个程序,很方便修改,也便于重用和便于阅读。
2.每个文件的开头应该写明这个文件是哪个项目里的哪个模块,是在什么编译环境下编译的,编程者(/修改者)和编程日期,值得注意的是一定不要忘了编程日期,因为以后你再看文件时,会知道大概是什么时候编写的,有些什么功能,并且可能知道类似模块之间的差异(有时同一模块所用的资源不同,和单片机相连的方法也不同,或者只是在原有的模块上加以改进)。
3.一个C源文件配置一个h头文件或者整个项目的C文件配置一个h头文件,一般采用整个项目的C文件配置一个h头文件的方法,并且使用#ifndef/#define/#endif的宏来防止重复定义,方便各模块之间相互调用。
4.一些常量(如圆周率PI)或者常需要在调试时修改的参数最好用#define定义,但要注意宏定义只是简单的替换,因此有些括号不可少。
5.不要轻易调用某些库函数,因为有些库函数代码很长(我是反对使用printf之类的库函数的,但这是一家之言,并不勉强各位)。
6.书写代码时要注意括号对齐,固定缩进,一个{}各占一行,我本人采用缩进4个字符,应该还是比较合适的,if/for/while/do等语句各占一行,执行语句不得紧跟其后,无论执行语句多少都要加{},千万不要写成如下格式:
for(i=0;i<100;i++){fun1();fun2();}或:
for(i=0;i<100;i++){
fun1();
fun2();
}
而应该写成:
for(i=0;i<100;i++)
{
fun1();
fun2();
}
7.一行只实现一个功能
比如:a=2;c=4;应该写成:
a=2;
c=4;
8.重要难懂的代码要写注释,每个函数要写注释,每个全局变量要写注释,一些局部变量也要写注释。注释写在代码的上方或者右方,千万不要写在下方,相信没有人写在左方吧,哈哈。
9.对各运算符的优先级要有所了解,记不得没关系,加括号就是,千万不要自作聪明说自己记得很牢。
10.不管有没有无效分支,switch函数一定要有default这个分支。让阅读者知道程序员并没有遗忘default,并且防止程序运行过程中出现的意外(健壮性)。
11.变量和函数的命名最好能做到望文生义。不要命名什么x,y,z,a,sdrf之类的名字。
12.函数的参数和返回值没有的话最好使用void。
13.goto语句:从汇编转型成C的人很喜欢用goto,但goto是嵌入式C的大忌,但是老实说,程序出错是程序员自己造成的,不是goto的过错;本人只推荐一种情况下使用goto语句,即从多层循环体中跳出。
14.指针是嵌入式C的精华,但是在单片机C中我个人认为少用为妙,其他地方可以随意使用,一来有时反而要花费多的空间,还有在对片外数据进行操作时会出错(可能是时序的问题)。
15.一些常数和表格之类的应该放到code区中以节省RAM。
16.程序应该要能方便的进行测试,其实这也与编程的思维有关;一般有三种:一种是自上而下先整体再局部;一种是自下而上先局部再整体;还有一种是结合两者往中间凑。我的做法是先大概规划一下整个编程,然后一个模块一个模块独立编程,每个模块调试成功再拼凑在一块调试。我建议:如果程序不大,可以直接用一个文件直接编,如程序很大,宜采用自上而下的方式,但更多的是那种处在中间的情况,宜采用自下而上或者结合的方式。
以下是《模块》或《文件》注释内容:
////////////////////////////////////////
//公司名称:
//模 块 名:
//创 建 者:注意要加日期
//修 改 者:注意要加日期
//功能描述:
//其他说明:
//版 本:
///////////////////////////////////////
//以下是《函数》注释内容:
//////////////////////////////////////
//函 数 名:
//功能描述:
//函数说明:
//调用函数://全局变量://输 入://返 回://设 计 者://修 改 者://版 本://////////////////////////////////////

编程规范案例
C作为一门工具,最终目的就是实现功能。
在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。
下面提供一个编程规范程序案例供参考。
/*******************************************程序名称:跑马灯程序***设计者: 信盈达张工 ***设计日期:2017年5月20日***修改者: 信盈达王工***修改日期:2017年5月25日***功 能:GPIO跑马灯测试程序***版本信息: V1.1***说明:4个LED分别接在GPB5~GPB5上****************************************/
#define rGPBCON (*(volatile unsigned*)0x56000010)
#define rGPBDAT (*(volatile unsigned*)0x56000014)
#define rGPBUP (*(volatile unsigned*)0x56000018)
/*******************************************函数名:delay()***形参:t延时时间长度***功能:延时函数***说明:一定时间长度的延时,时间可调*****************************************/void delay(unsigned int t){for(;t>0;t--);}/******************************************函数名:main()***形参:无***功能:主程序GPIO跑马灯测试程序***说明:4个LED分别接在GPB5~GPB5上***************************************/int main (void){ int j;
/*0000 0000 0000 0001 0101 0100 0000 0000 配置成输出GPB5~GPB8 */ rGPBCON=0x00015400;
/*GPB1~GPB10禁止上拉*/ rGPBUP =0x3ff;
while(1) { for(j=0;j<4;j++) { rGPBDAT=0xfdf; delay(3000); rGPBDAT=0xfbf; delay(3000); rGPBDAT=0xf7f; delay(3000); rGPBDAT=0xeff; delay(3000); } }}


1楼2022-04-19 09:22回复