编程规范(上海培训总结)

 一.程序排版
1.相对独立的程序块之间,变量说明之后加空行。
2.if、for、do、while等语句的执行语句无论多少都要加{}。
3.对两个以上关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后都要加空格;进行非对等操作时,如果是关系密切的立即操作符如->,后不应加空格。例:int d = a + b;
4.变量声明时,最好用Tab键把变量类型和变量名分开。
二.代码注释
1.全局变量要有详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项的说明。
2.在程序块的结束行右方加注释标记,以表明某程序块的结束。这在程序块行数较长时十分有用。例:
if(……)
{
  // program code
  while(index < MAX_INDEX)
 {
   // program code
 }/* end of while(index < MAX_NDEX) */
}/* end of if(……) */
三.标识符命名
1.匈牙利命名法 - window命名法
1) 类名和函数名用大写字母开头的单词组成。
class Node;class LeafNode;
void SetValue(int nValue);
2)变量和参数用小写字母开头的单词组成。
BOOL bFlag; int drawMode;
3)常量大写,用下划线分开。
const int MAX = 100;
const int MAX_LEN = 200;
4)类的成员函数前加 m_
   全局变量前加 g_
四.可读性
1.注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
五.存储空间分配
静态存储区 -- 全局变量
栈存储区   --局部变量,系统自动释放
堆存储区   -- new,malloc等函数申请的空间,要有程序自己来释放
六.函数和过程
1. 函数头部应进行注释,列出函数的功能、输入参数、输出函数、返回值等。
2. 对所调用的函数的错误代码要仔细、全面的检查。不然可能会影响其后的程序运行。例:
int usReceiverID = OsConvertStaNONToL(nFjkIndex,nStaNo);
if(usReceiverID == 0)// 错误返回0,注意防范处理
{
   AfxMessageBox("convert station no @yfwei");// alarm
   return;// or break 中断程序运行
}
3. 要检查函数所有函数输入的有效性。一定要注意!
4. 检查所有非参数输入的有效性,如数据文件、公共变量等。
函数的输入主要有两种:一种是参数的输入;另一种是全局变量、数据文件的输入等非参数输入。函数在使用之前,应进行必要的检查。
5.减少函数本身或函数间的递归调用。原因:
影响可读性;
占用系统的系统资源,如栈空间;
影响调试。
七.程序效率
1.循环体内工作量最小化。
2.在多重循环中,应将最忙的循环放在最内层。以减少CPU切入循环层的次数。
八.质量保证
1.过程/函数中申请的内存,在过程/函数结束前要释放掉,否则会造成内存泄露.
2.过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出前要关闭.
说明:某个线程的句柄在线程退出时不释放,也可能会造成内存泄露,要注意.
3.位图,笔刷等用完后要select出来,不然会导致系统GDI资源丢失或内存泄露.
4.使用new/delete,少使用malloc/free.new/delete是C++语法,realloc易造成内存抖动.
5.防止引用已经释放的内存空间.
说明:在实际的编程中,稍不留心就会出现在一个模块中释放了某个内存块,如C语言指针(此时该指针已经变成了野指针),而另外一模块中在随后的某个时刻又使用了它,这可能会造成很大的错误,甚至系统崩溃.
6.防止内存操作越界.
说明:内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主要错误之一,后果往往非常严重,操作时要小心。
7.认真处理程序所能遇到的各种情况。
8.系统应有一定的容错能力,对一些错误事件(如用户误操作)能进行自动补救。
9.注意容易混淆的操作符。
说明:判断是否相等时,把数字写在前面  如: if(1 == a)
九.代码编辑、编译、审查
1.打开编译器的所有告警开关对程序编译,把warning当error处理,全部改正。
十.宏
1.在C++程序中尽量少使用宏,应该用inline函数和const变量取代宏。
2.用宏定义表达式时,要使用完备的括号。
说明:#define SQUARE(x) x*x
      i = SQUARE(a+b)// 宏被替换为a+b*a+b,所以必须加括号
十一.工程文件组织
1.将独立性比较强的模块抽取出来,做成DLL,空间或COM组件,该模块可单独编写和测试,也增强了可重用性。
十二.其他
1.可用#define 定义数组长度
#define SENSOR_nb 50
SENSOR_state SENSOR_tab_states[SENSOR_nb];
2.防止头文件被重复包含
/*** <file name> ***/
#ifndef <FILE_NAME>_h
#define <FILE_NAME>_h
 // file definations
#endif
3.比较浮点数的大小不能用 ==
用fabs(Double_a - Double_b) < 0.001
4.用指针传递大数据参数
说明:如果按照值传递大数据结构或数组,可能会引起堆栈溢出,造成不可预料的后果。
5.不同类型变量间的数据转换必须强制转换,即使类型之间仅存在有无符合的差异。【安全键软件编程规定】
6.void指针可以强制采用强制转换指向其他不同类型的指针,但要注意使用。
7.switch 语句要有default语句用来处理非期望的行为。
8.goto可以跳出多重循环体。
十三.安全C语言规范
1.C语言安全风险
1)指针:使用指针访问数组越界;未定义指针摧毁内存;野指针摧毁内核
2)缺少边界检查:无法检查数组和字符串边界;数组越界摧毁内存
3)全局变量:参数增多验证函数困难,多线程访问更改值
4)void指针recast任何指针类型
5)语言错误:=和==,&和&&,控制结构中分号,符号和无符号比较
6)优先级:非预期的算术或逻辑运算符优先级
2.安全C的语言规则
1)使用括号区分运算符优先级,不要依靠编译器默认优先级
2)在宏中使用括号
3)进行显示转换,不要让编译器默认转换
4)检查数组和字符串越界访问
5)尽量减少使用全局变量
6)在switch……case语句中,不要漏掉default分支
7)尽量避免使用递归函数
8)不允许在函数级以下定义变量
9)避免使用联合体
10)禁止使用变长函数,如:printf
11)指针的数学运算仅限于遍历数据结构是简单的运算
12)仅允许在程序开头使用malloc函数
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值