-
-
-
本文背景:
如果在每一次做项目后,都能把期间遇到的问题或者经验总结下来,相信随着时间的推移会有相当的积累,就算利息吧。
本文目的:
本文将不断更新。内容分为:编码规范、内存管理、异常处理等章节,也会不断更新。
本文内容:
1.编码规范
1.1 命名规则
我们知道,匈牙利命名规则有着两面性,一方面它使得程序具有较高的可读性;而另一方面,它使得当需要更改变量类型时,额外修改的工作增加。以下是常用数据类型的匈牙利表示法,根据你的公司要求可能有所不同。
数据类型 | 前缀 | 注解 |
Global Data | g_ |
|
Constant Data | c_ |
|
Static Data | s_ |
|
Class Member | m_ |
|
|
|
|
char | c |
|
int | i/n |
|
short | n |
|
long | l |
|
byte | by |
|
unsigned | u |
|
bool | b |
|
char[] | sz |
|
WORD | w |
|
DWORD | dw |
|
double | d |
|
float | f |
|
string | s |
|
void | v |
|
Handle | h |
|
Pointer | p |
|
Array | a |
|
1.2 常量定义
· 如果变量不会被改变值,请用const;
· 如果期间用到的数字有特殊意义或出现若干次,请定义一个const变量;
· 当定义方法时,请思考以下问题:方法中的参数会不会被改变,如果不会,请定义为const;
· 尽量不用宏定义,用const变量代替可以拥有类型检查;
例子:
HRESULT FUNC1(const unsigned char* const pBuffer,bool& bProcess).
1.3 可读性编程
· 简单未必好
用if-else代替?: 增加可读性。
· If-else 一定以{}开始和结束
尽管if后面只有一句话,也要用{}。
例子:
If (somthing)
{
i++;
}
2.内存管理
2.1 释放内存
· 主动分配
当使用 New 或 Malloc等分配内存时,需要主动的释放不用的内存,以防内存泄露。
如果你对内存管理很感兴趣,请参考本人博客:
http://blog.youkuaiyun.com/yeming81/archive/2008/01/19/2052311.aspx
· 函数返回指针
当你调用的方法内部主动分配一个堆内存,然后返回一个指针引用给你时,你需要在用完后释放它,否则会出现内存泄露。
例子:
char* pContent=_com_util::ConvertBSTRToString(bstrContent);
use the pContent to do something;
delete pContent;
· 在方法返回前释放所有资源
当你从方法中返回时,不要忘记释放之前分配的所有资源,包括各种文件句柄资源。
当你在方法中间因为异常返回时,常常会忘记这一点。
例子:
Int Function1()
{
char[] sz=new char[1024];
//do something special
If()
{
//remember to do this
delete sz;
return -1;
}
//do something special
delete sz;
}
· 使用智能指针 Smart Pointer 代替普通接口
你不必要担心内存释放,因为智能指针会自动释放。
//不要使用它
IMyInterface pInterface //智能指针
CComPtr<IMyInterface > pInterface;
请注意,不要做如下操作
pInterface=NULL, 否则智能指针无法释放内存。
· 使用 CComBSTR 代替 BSTR
使用BSTR时,你需要自己去释放内存:
BSTR bstrContent;
SysFreeString(bstrContent);
而使用智能指针你不用担心这个。
CComBSTR bstrContent;
3.异常处理
· 检查方法返回值
当调用一个方法时,思考这个问题,我是否需要检查返回值去处理异常的情况;虽然可能不会出现问题,但是最好还是做一下检查。
· 使用指针之前检查一下是否为NULL
以防抛出空指针异常,请在使用前检查指针的值是否为NULL
4.常用函数
4.1文件操作
· 按行读取文件
Ifstream.getline(char* pChar, int size)
当文件一行的长度大于size缓冲时,文件指针不会继续往下移动。
解决办法,用另外一个函数代替:
getline(ifstream&, string)
---文章结束