每个C++/C程序常分为两个文件,一个用于保存程序的声明(在C++里面有时也用.hpp来表示头文件,但是一般情况下常用.h),一个用于保存文件的定义。
1、版本与版权的声明
以上声明放置在文件的开头,含以下内容:
<1>.版权信息
<2>.文件名称,标识符,摘要
<3>.当前版本号,作者/修改者,完成日期
<4>.版本历史信息
2、头文件的结构
<1>.开头处的版权和版本说明
<2>.预处理块
<3>.函数和类结构声明等.
为防止头文件被重复定义,应当用ifndef/define/endif结构产生预处理块。
不提倡使用全局变量,尽量少使用如:extern int value
头文件的声明示例如下:
#ifndef graphics_h
#define graphics_h
#include <math>
#include "myheader.h"
class classname
{
private:
//............
protected:
//.............
public:
//.............
}
#endif
3、命名建议
<1>.在静态变量前加上s_,如:s_initValue
<2>.在全局变量前加上g_,如:g_howmuch
<3>.类的数据成员前加上m_,如:private int m_val
4、布尔变量与零值比较
<1>.不可将布尔变量与true,false,0或1直接比较。根据布尔类型语义,零值为假,任何非零值记为真,假设有布尔变量flag,其与零值的标准比较语句如下:
if (flag)... 表示flag为真
if (!flag)... 表示flag为假
不良风格为:if (flag==true)...或if (flag==0)...
5、指针与零值的比较
<1>.应将指针变量用"=="或!=与null比较:
标准比较语句为:
1. if (p==null)...
2. if (p!=null)...
不要写成:if (p) 或 if (!p)
<2>.if (null==p)和if (p==null)是等价的。
实际上为了避免少写一个=变成赋值,因此还提倡用前者表达。
<3>.Return (Condition?x:y) 这是一个三目运算表达方式。
<4>.在程序中,可以在异常模块加入return EXIT_FAILURE或EXIT_SUCCESS,
这两个都包涵在头文件<stdlib.h>当中。
6、循环语句的效率问题
c++/c中,for语句使用最常,后为while,最后为do (比较少用),提高循环体效率的方法是降低循环体的复杂性。
建议:在多重循环中,若有可能,应将最长的循环放在最内层,最短的循环放在最外层,以减少cpu跨切循环层的次数。
7、goto语句
对等goto语句,应该慎用,而非禁用。
8、const与#define
const与#define的比较,前者更有优点,const常量有数据类型,而define没有,编译器可对前者进行类型安全检查,在c++中只使用const常量而不建议使用define宏变量。
9、枚举与常量
建议在类中使用枚举常量实现在整个类中建立恒定的常量,枚举常量不会占用对象的内存空间,它们在编译时被全部求值,枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数如:PI=3.14159...
10、函数参数
建议函数参数书写要完整,不要只写类型不写参数名,如果参数是指针,且公作输入用,则应在类型前加const以防止函数体内被意外修改。
11、const &
若输入参数以值方式来传递参数,则宜改用const& 方式来传递,以省去临时的构造和析构过程,从而提高效率。
12、返回值的规则
<1>.不要省略返回值的类型,若函数没有返回值,则函数应声明为void类型。
<2>.不要将正常值和错误标志混在一起返回,正常值用输出参数获释,而错误标志用 return 返回.
13、函数内部实现的规则
<1>.在函数入口处,对参数有效性进行检查。
<2>.在函数体的出口处,对return 语句的正确性和效率进行检查。
14、return返回值注意事项
<1>.return不可返回指向“栈内存”的指针或引用.因为该内存在函数体结束时被自动销毁。
<2>.要搞清返回的究竟是值,指针还是引用。
<3>.若函数返回值是一个对象,要考虑return语句的效率。
15、使用断言
程序一般分debug版和release版,debug用于内部测试,release发行给用户使用,使用断言捕捉不应发生的非法情况。
<<前一篇 VS下对C++库DLL代码的断点调试步骤 | C++字符串函数快速查询 后一篇>> |