主要设计规则3:在.h文件的文件作用域内避免使用自由函数(运算符函数除外);在.c文件中避免使用带有外部连接的自由函数(包括运算符函数)。(同主要设计规则2)
自由函数应该包含在一个结构中,这样只有结构名可能会有冲突危险。自由运算符重载函数不能放在结构中。
主要设计规则4:在.h文件的文件作用域内避免使用枚举类型、typedef和常量数据。
C++支持嵌套类型,因此可以在结构中定义枚举类型、typedef和常量数据。将枚举、typedef嵌套在结构中,可以方便查找。
主要设计规则5:除非是作为包含卫哨,否则在头文件中应避免使用预处理宏。
包含卫哨应遵循一定的规则,将头文件名并入包含卫哨可以保证没有哪两个包含卫哨符号会是一样的,例如:INCLUDED_A(INCLUDED_头文件名)
主要设计规则6:只有类、结构、联合和自由运算符函数应该在.h文件的文件作用域内声明;只有类、结构、联合和内联函数(成员或自由运算符)应该在.h文件的文件作用域内定义。
主要设计规则7:在每个头文件的内容周围放置一个唯一的和可预知的(内部)包含卫哨。
次要设计规则1:在每个头文件预处理器的包含指令周围,放置一个冗余(外部)包含卫哨。
// s13.h
#ifndef INCLUDED_S13
#define INCLUDED_S13
#ifndef INCLUDED_W1
#include "w1.h"
#endif
#ifndef INCLUDED_W2
#include "w2.h"
#endif
// ...
#ifndef INCLUDED_MATH
#include
#define INCLUDED_MATH
#endif
class S13 {
W1 d_w1a;
W2 d_w2a;
// ...
};
#endif
包含外部冗余卫哨可以避免预处理器的冗余解析,提高编译速度,系统规模越大,加速效果越显著。冗余卫哨对于.c文件不是必要的。应该避免将#include指令放在头文件中。
指导方针1:为接口建立文档以便其他人可以使用,至少请另一个开发者检查每个接口。
指导方针2:明确地声明条件(在该条件下行为没有定义)。
例如:
struct MathUtil {
// ...
static int factorial (int n);
// Return the product of consecutive integers between 1 and n
// for positive n. If n is 0, 1 is returned.
// Note that the behavior is not defined for negative values
// of n nor for results that are too large to fit in an int.
};
明确规定为定义行为,避免客户或其他对实现不熟悉的人,依赖于这种巧合的行为。
原则1:使用assert语句有助于为程序员实现编码时的假设建立文档。
次要设计规则2:使用一种一致的方法(例如加前缀d_)来突出类成员函数。
次要设计规则3:使用一种一致的方法(例如第一个字母大写)来区别类型名称。
次要设计规则4:使用一种一致的方法(例如所有的字母都大写以及使用下划线)来标识不变的值,如枚举值、const数据和预处理器常量。
指导方针3:标识符名称必须一致;使用大写字母或下划线(但不能同时使用两种)来分割标识符中的单词。
指导方针4:以相同方式使用的名称必须一致;特别是对于递归设计模式(recurring design patterns)(例如迭代),要采用一致的方法名称和运算符。
在大型项目中,可以授权一个顶级开发小组担当"接口工程师",通过这种方式取得跨越开发小组的一致性。