头文件

  • .cc 命名源文件,.h 命名头文件

  • 在头文件的定义里,需要根据路径写好 header guard:

    假设 foo 项目中头文件 foo/src/bar/baz.h 应该有如下的 header guard

    1
    2
    3
    4
    5
    6
    #ifndef FOO_BAR_BAZ_H_
    #define FOO_BAR_BAZ_H_

    // ......

    #endif
  • 不要依赖间接导入.例如如果 foo.cc 需要 bar.h 中的符号,无论 foo.h 是否导入了 bar.h,都应该在 foo.cc 里导入 bar.h

  • 避免使用前向声明
    前向声明 (forward declaration) 是没有对应定义 (definition) 的声明.

#include 的顺序

头文件的路径应相对于项目源码目录, 不能出现 UNIX 目录别名 (alias).例如, 应该按如下方式导入 google-awesome-project/src/base/logging.h:

1
#include "base/logging.h"

dir/foo.ccdir/foo_test.cc 这两个实现或测试 dir2/foo2.h 内容的文件中, 按如下顺序导入头文件:

  1. dir2/foo2.h
  2. 空行
  3. C 语言系统文件 (确切地说: 用使用方括号和 .h 扩展名的头文件), 例如 <unistd.h><stdlib.h>.
  4. 空行
  5. C++ 标准库头文件,例如 <algorithm><cstddef>.
  6. 空行
  7. 其他库的 .h 文件
  8. 空行
  9. 本项目的 .h 文件

命名空间

【内部链接】:将函数标记为 static,或者将其放在 unnamed namespace 里可以把它对外隐藏.建议只在 .cc 源文件里这么做,而不要在 .h 头文件里搞.