KeyNotes:
.cc
文件里使用匿名命名空间或者sttic
声明X::Y::foo
等价与X::foo
。其主要用于跨版本的ABI兼容问题namespace X{ inline namespace Y{ void foo(); } // namespace X } // namespace Y
.h
头文件使用匿名命名空间违背C++的唯一定义原则(ODR)使用建议:
在namespace
的结尾}
处添加注释
不要在std
命名空间中声明任何东西,包括标准库类的前置声明(行为未定义)
禁止使用类似using namespace foo
的语句,会导致污染当前命名空间
不要在头文件中使用命名空间别名,除非显示标记内部空间使用。如下是可以的:
namespace paddle{ namespace framework{ using Tensor = paddle::Tensor; // 仅在当前命名空间使用 void foo(){ using LoDTensor = paddle::LoDTensor; // 限制在一个函数内部使用 } } // namespace framework } // namespace paddle
.cc
文件中一个变量不需要被外部使用时(内部链接性),可以将其放在匿名空间或者声明为static
。但不要在.h
文件中这么做。KeyNotes:
使用建议:
定义非成员函数,且只在.cc
文件中使用,使用static
关键字修饰,如:
static void foo(int x){}
.c
和.cc
都是一个编译单元const char[]
分别代替 vector
和string
explicit
关键字。explicit
,因为他们并不执行类型转换。explicit
关键字(没有意义);例外情况:除了第一个参数外其他参数都有默认值。std::initializer_list
作为参数的构造器,也应该省去explicit
。KeyNotes:
使用建议:
KeyNotes:
使用建议:
public
virtual
关键字override
关键字=0
)和静态函数protected
)<
,请也重载>
、=
public:
、protected:
、private:
来组织typedef
、using
和嵌套的类与结构体)、常量、工厂函数、构造函数、赋值运算符、析构函数、其他函数、数据成员。