(1)、避免多重包含是学编程时最基本的要求;
(2)、前置声明是为了降低编译依赖,防止修改一个头文件引发多米诺效应;
(3)、内联函数的合理使用可提高代码执行效率;
(4)、-inl.h可提高代码可读性(一般用不到吧:D);
(5)、标准化函数参数顺序可以提高可读性和易维护性(对函数参数的堆栈空间有轻微影响,我以前大多是相同类型放在一起);
(6)、包含文件的名称使用.和..虽然方便却易混乱,使用比较完整的项目路径看上去很清晰,很条理,包含文件的次序除了美观之外,最重要的是可以减少隐藏依赖, 使每个头文件在“最需要编译”(对应源文件处 :D)的地方编译,有人提出库文件放在最后,这样出错先是项目内的文件,头文件都放在对应源文件的最前面,这一点足以保证内部错误的及时发现了。
2.作用域:
名字空间:鼓励在.cc文件内使用匿名名字空间.使用具名的名字空间时,其名称可基于项目名或相对路径.不要使用using 关键字.
定义:名字空间将全局作用域细分为独立的,具名的作用域,可有效防止全局作用域的命名冲突.
优点:(1)、虽然类已经提供了(可嵌套的)命名轴线(YuleFox注:将命名分割在不同类的作用域内),名字空间在这基础上又封装了一层.(2)、举例来说,两个不同项目的全局作用域都有一个类Foo,这样在编译或运行时造成冲突.如果每个项目将代码置于不同名字空间中,project1::Foo和project2::Foo作为不同符号自然不会冲突.
缺点:(1)、名字空间具有迷惑性,因为它们和类一样提供了额外的(可嵌套的)命名轴线.(2)、在头文件中使用匿名空间导致违背C++的唯一定义原则(One Definition Rule (ODR)).
结论:根据下文将要提到的策略合理使用命名空间.
在.cc文件中,允许甚至鼓励使用匿名名字空间,以避免运行时的命名冲突:
namespace { // .cc 文件中
// 名字空间的内容无需缩进
enum { kUNUSED, kEOF, kERROR }; // 经常使用的符号
bool AtEof() { return pos_ == kEOF; } // 使用本名字空间内的符号 EOF
} // namespace然而,与特定类关联的文件作用域声明在该类中被声明为类型,静态数据成员或静态成员函数,而不是匿名名字空间的成员.如上例所示,匿名空间结束时用注释 // namespace 标识.
不要在.h文件中使用匿名名字空间.
具名的名字空间使用方式如下:
(1)、用名字空间把文件包含,gflags的声明/定义,以及类的前置声明以外的整个源文件封装起来,以区别于其它名字空间:
// .h 文件
namespace mynamespace {
// 所有声明都置于命名空间中
// 注意不要使用缩进
class MyClass {
public:
…
void Foo();
};
} // namespace mynamespace// .cc 文件
namespace mynamespace {
// 函数定义都置于命名空间中
void MyClass::Foo() {
…
}
} // namespace mynamespace通常的.cc文件包含更多,更复杂的细节,比如引用其他名字空间的类等.
#include “a.h”
DEFINE_bool(someflag, false, “dummy flag”);
class C; // 全局名字空间中类 C 的前置声明
namespace a { class A; } // a::A 的前置声明
namespace b {
…code for b… // b 中的代码
} // namespace b(2)、不要在名字空间std内声明任何东西,包括标准库的类前置声明.在std名字空间声明实体会导致不确定的问题, 比如不可移植.声明标准库下的实体,需要包含对应的头文件.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-35033-3.html
小王子
现在的台湾媒体还在不停的抹黑大陆好吧