-inl.h文件:复杂的内联函数的定义,应放在后缀名为-inl.h的头文件中。
内联函数的定义必须放在头文件中,编译器才能在调用点内联展开定义。然而,实现代码理论上应该放在.cc 文件中,我们不希望.h文件中有太多实现代码,除非在可读性和性能上有明显优势。
如果内联函数的定义比较短小,逻辑比较简单,实现代码放在.h文件里没有任何问题。比如,存取函数的实现理所当然都应该放在类定义内。出于编写者和调用者的方便,较复杂的内联函数也可以放到.h文件中,如果你觉得这样会使头文件显得笨重,也可以把它萃取到单独的-inl.h中。这样把实现和类定义分离开来,当需要时包含对应的-inl.h即可。
-inl.h文件还可用于函数模板的定义。从而增强模板定义的可读性。
别忘了-inl.h和其他头文件一样,也需要#define保护。
函数参数的顺序:定义函数时,参数顺序依次为:输入参数,然后是输出参数。
C/C++函数参数分为输入参数,输出参数,和输入/输出参数三种。输入参数一般传值或传const引用,输出参数或输入/输出参数则是非const指针。对参数排序时, 将只输入的参数放在所有输出参数之前。尤其是不要仅仅因为是新加的参数,就把它放在最后;即使是新加的只输入参数也要放在输出参数之前。c++ strchr函数
这条规则并不需要严格遵守。输入/输出两用参数(通常是类/结构体变量)把事情变得复杂,为保持和相关函数的一致性,你有时不得不有所变通。
#include的路径及顺序:使用标准的头文件包含顺序可增强可读性, 避免隐藏依赖:C库,C++库,其他库的.h,本项目内的.h.
项目内头文件应按照项目源代码目录树结构排列,避免使用UNIX特殊的快捷目录.(当前目录)或 ..(上级目录)。例如,google-awesome-project/src/base/logging.h 应该按如下方式包含:
#include "base/logging.h"又如,dir/foo.cc的主要作用是实现或测试dir2/foo2.h的功能,foo.cc中包含头文件的次序如下:
(1)、dir2/foo2.h(优先位置)
(2)、C系统文件
(3)、C++系统文件
(4)、其他库的.h文件
(5)、本项目内.h文件
这种排序方式可有效减少隐藏依赖。我们希望每一个头文件都是可被独立编译的(yospaly译注:即该头文件本身已包含所有必要的显式依赖),最简单的方法是将其作为第一个.h文件#include进对应的.cc.
dir/foo.cc和 dir2/foo2.h通常位于同一目录下(如 base/basictypes_unittest.cc 和 base/basictypes.h),但也可以放在不同目录下。c++ strchr函数
按字母顺序对头文件包含进行二次排序是不错的主意(yospaly译注:之前已经按头文件类别排过序了)。
举例来说,google-awesome-project/src/foo/internal/fooserver.cc的包含次序如下:
#include "foo/public/fooserver.h" // 优先位置 #include <sys/types.h> #include <unistd.h> #include <hash_map> #include <vector> #include "base/basictypes.h" #include "base/commandlineflags.h" #include "foo/public/bar.h"译者(YuleFox)笔记:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-35033-2.html
去不了