《凌波微步-软件开发警戒案例集》读书摘要
p18.
"匈牙利命名法存在很多严重的问题,其中之一是:一旦要修改变量类型,也就必须同时修改变量名称。这一问题,反映在必须保证接口稳定的WIN32 API上,更为棘手。"
p31.
"几乎所有现代C/C++编译器在处理内存中的数据结构以及sizeof运算符时,默认情况下,都会把类或结构占用的空间大小在8字节边界处对齐,以优化代码的执行速度。
可以通过预编译命令 #pragma pack (1)来取消这种默认对齐"
p42.
"定义和实际存储相关的数据结构时,最好不要使用int这种"可变长"的数据类型——int在16位、32位、64位计算机上的字节长度是不同的——相反,使用诸如DWORD这样的定长类型是个不错的选择。"
p66.
"assert()宏仅在NDEBUG宏无效的情况下才发挥作用,即若定义了NDEBUG宏(软件的releass版本),则assert()宏相当于空语句;若未定义NDEBUG宏(Debug版本),则assert检查参数,参数为假时,输出错误信息并终止程序。
assert()宏的最大问题是其在软件的release版本中将变为空语句,不起任何作用。
因此,不要在assert()中写入任何影响程序运行状态的语句,如assert(fp=fopen()),这种用法是错误的。
另外,对于外部参数(用户输入)不应该用assert()宏来检查有效性,assert()宏应用来检查内部参数(确定因素)。
MFC中特别提供了一个VERIFY宏,除了能完成assert()的验证功能外,其最大的特点是无论在Debug版还是Release版本中,都永远有效。"
p91.
"面向对象编程中不容忽视的一个问题:类的构造函数是没有返回值的。
这个特点使得如果在构造函数中进行资源分配,就必须采取一定办法将分配失败的情况通知调用者,否则就有可能造成内存访问异常。
解决方法通常有两种:
一是干脆不在构造函数中进行资源分配,而是在类中实现Initialize()和Uninitialize(),由这两个函数负责资源的释放和分配,返回值类型为bool。
二是利用对象的异常处理机制,当构造函数发生分配错误时,就跑出异常,一旦捕获异常,就不进行后续的工作。"

浙公网安备 33010602011771号