一、头文件
所有头文件都应该使用#define 防止头文件被多重包含(multiple inclusion),命名格式当是:<PROJECT>_<PATH>_<FILE>_H_为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。例如,项目foo 中的头
文件foo/src/bar/baz.h 按如下方式保护:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
内联函数
只有当函数只有10 行甚至更少时才会将其定义为内联函数(inline function)。
优点:当函数体比较小的时候,内联该函数可以令目标代码更加高效。对于存取函数
(accessor、mutator)以及其他一些比较短的关键执行函数
缺点:滥用内联将导致程序变慢,内联有可能是目标代码量或增或减,这取决于被内联的函
数的大小
结论:一个比较得当的处理规则是,不要内联超过10 行的函数。对于析构函数应慎重对待,
析构函数往往比其表面看起来要长,因为有一些隐式成员和基类析构函数(如果有的话)被
调用!
另一有用的处理规则:内联那些包含循环或switch 语句的函数是得不偿失的,除非在大多
数情况下,这些循环或switch 语句从不执行。
函数参数顺序(Function Parameter Ordering)
定义函数时,参数顺序为:输入参数在前,输出参数在后。
包含文件的名称及次序
次序如下:C 库、C++库、其他库的.h、项目内的.h。
二、作用域
在.cc 文件中,允许甚至提倡使用不具名命名空间,以避免运行时的命名冲突:
namespace { // .cc 文件中
// 命名空间的内容无需缩进
enum { UNUSED, EOF, ERROR }; // 经常使用的符号
bool AtEof() { return pos_ == EOF; } // 使用本命名空间内的符号EOF
} // namespace
不能在.h 文件中使用不具名命名空间。
具名命名空间使用方式如下:
命名空间将除文件包含、全局标识的声明/定义以及类的前置声明外的整个源文件封装起来,
以同其他命名空间相区分。
// .h 文件
namespace mynamespace {
// 所有声明都置于命名空间中
// 注意不要使用缩进
class MyClass {
public:
...
void Foo();
};
} // namespace mynamespace
// .cc 文件
namespace mynamespace {
// 函数定义都置于命名空间中
void MyClass::Foo() {
...
}
} // namespace mynamespace
不要声明命名空间std 下的任何内容,包括标准库类的前置声明。声明std 下的实体会导
致不明确的行为,如,不可移植。声明标准库下的实体,需要包含对应的头文件。
最好不要使用using 指示符,以保证命名空间下的所有名称都可以正常使用。
// 禁止——污染命名空间
using namespace foo;
在.cc 文件、.h 文件的函数、方法或类中,可以使用using。
// 允许:.cc 文件中
// .h 文件中,必须在函数、方法或类的内部使用
using ::foo::bar;
非成员函数(Nonmember)、静态成员函数(Static Member)和全局函数(Global
Functions)
使用命名空间中的非成员函数或静态成员函数,尽量不要使用全局函数。
有时,不把函数限定在类的实体中是有益的,甚至需要这么做,要么作为静态成员,要么作
为非成员函数。非成员函数不应依赖于外部变量,并尽量置于某个命名空间中。相比单纯为
了封装若干不共享任何静态数据的静态成员函数而创建类,不如使用命名空间。