52、Google的Cpp常见的编码风格

以下是Google C++编码风格的详细介绍,涵盖主要方面和具体规则:


一、头文件

  1. 自包含头文件
    • 每个头文件(.h)应能独立编译,包含所有必要的其他头文件。
    • 使用 #define 保护防止重复包含:
      #ifndef FOO_BAR_BAZ_H_
      #define FOO_BAR_BAZ_H_
      ...
      #endif // FOO_BAR_BAZ_H_
      
  2. 包含顺序
    • 顺序为:相关头文件、C系统头、C++标准库头、其他库头、本项目头。
    • 示例:
      #include "foo/server/fooserver.h" // 相关头文件
      
      #include            // C系统头
      #include 
      
      #include                 // C++标准库
      #include 
      
      #include "base/basictypes.h"     // 本项目其他头
      
  3. 前置声明
    • 避免使用前置声明,直接包含所需头文件,除非有明确的性能需求。

二、作用域

  1. 命名空间
    • 使用命名空间防止命名冲突,命名空间名全小写(如 google::project)。
    • 禁止使用 using namespace 在头文件中。
    • 匿名命名空间用于文件内静态变量/函数:
      namespace {
      int kPrivateVar = 42;
      } // namespace
      
  2. 全局变量
    • 避免使用全局变量,若必须使用,用 const 修饰并添加前缀 k
      constexpr int kMaxBufferSize = 1024;
      

三、类

  1. 构造函数
    • 单参数构造函数必须用 explicit 避免隐式转换:
      explicit Foo(int value);
      
    • 初始化列表中的参数顺序应与类成员声明顺序一致。
  2. 结构体 vs 类
    • 仅当仅有数据成员时使用 struct,否则使用 class
  3. 继承
    • 优先使用组合而非继承。
    • 公有继承必须满足“is-a”关系,私有继承仅用于实现细节。
  4. 运算符重载
    • 仅当语义明显时重载运算符(如 operator+ 用于加法)。

四、函数

  1. 参数传递
    • 输入参数:值传递小对象,const 引用传递大对象。
    • 输出参数:使用指针(如 int* result)。
    • 示例:
      void ProcessData(const std::string& input, int* output);
      
  2. 函数长度
    • 函数应尽量简短,通常不超过40行。
  3. 内联函数
    • 仅对短小(如10行以内)且频繁调用的函数使用 inline

五、命名规则

  1. 变量/函数名
    • 变量:全小写,单词间用下划线(如 total_count)。
    • 函数:小驼峰(如 processData())。
    • 类/结构体:大驼峰(如 MyClass)。
    • 常量:k 前缀(如 kDaysInWeek)。
  2. 文件命名
    • 全小写下划线分隔(如 my_class.cpp)。
  3. 枚举类型
    • 枚举名大驼峰,枚举值全大写(如 enum UrlType { HTTP, HTTPS };)。

六、格式规范

  1. 缩进
    • 使用2个空格缩进,禁止使用制表符。
  2. 大括号
    • 控制语句(如 if, for)必须使用大括号,左括号与语句同行:
      if (condition) {
        DoSomething();
      } else {
        ...
      }
      
  3. 行长度
    • 每行不超过80字符,特殊情况可放宽至100字符。
  4. 空格
    • 操作符两侧加空格,函数参数逗号后加空格:
      int x = 3 + 4;
      Func(a, b, c);
      

七、异常处理

  • 禁用异常:Google代码不使用C++异常,改用错误返回码或 Status 对象。
  • 错误处理示例:
    absl::StatusOr<Result> ComputeResult() {
      if (error) {
        return absl::InvalidArgumentError("Error message");
      }
      return result;
    }
    

八、其他重要规则

  1. 智能指针
    • 优先使用 std::unique_ptr,仅在需要共享所有权时使用 std::shared_ptr
  2. C++11及更新特性
    • 允许使用部分C++11特性(如 auto, lambda),但需谨慎评估可读性。
  3. RTTI禁用
    • 禁用运行时类型识别(typeiddynamic_cast),通过虚函数实现多态。
  4. 类型转换
    • 使用 static_cast, const_cast 等显式转换,禁用C风格强制转换。

九、代码注释

  1. 文件注释
    • 文件顶部注明版权、作者、简要描述。
  2. 函数注释
    • 描述功能、输入输出、异常情况:
      // Computes the sum of two integers.
      // Args:
      //   a: The first operand.
      //   b: The second operand.
      // Returns:
      //   The sum of a and b.
      int Add(int a, int b);
      
  3. TODO注释
    • 标记待完成事项:
      // TODO(user): Implement efficient algorithm.
      

十、工具与执行

  • clang-format:通过配置 .clang-format 文件自动格式化代码。
  • 代码审查:在团队协作中通过代码审查确保规范执行。
  • 持续集成:集成静态分析工具(如Clang-Tidy)检查合规性。

总结

Google C++风格的核心目标是提高代码一致性、可维护性和团队协作效率。尽管部分规则(如禁用异常)存在争议,但严格遵循规范能显著降低项目维护成本。开发者应根据实际项目需求灵活调整,同时保持整体代码风格统一。建议定期查阅官方最新文档以跟进更新。

你可能感兴趣的:(#,cpp整理笔记,c++)