置顶

本指南完全对齐Bjarne Stroustrup的现代C++设计思想 澳五机器人

作者:admin | 分类:澳五机器人 | 浏览:3 | 日期:2026年06月21日

一、核心设计理念

本指南完全对齐Bjarne Stroustrup的现代C++设计思想,核心目标是消除未定义行为(UB)、实现Fail Fast快速失败机制,在保留C++性能优势的前提下,大幅提升代码的可维护性与安全性。指南不追求过度的“绝对安全”,而是通过明确的编码约定,让开发者在类Unix环境下写出稳定、高效、风格统一的C++代码。

二、基础环境与头文件约定

  1. 强制使用 <bits/stdc++.h> 作为全局头文件,无需单独引入零散标准库头文件。该头文件并非竞赛专属,GCC官方提供的实现完全覆盖了所有标准库组件,额外增加的编译耗时在现代硬件下可以忽略不计。

  2. 该约定的附加作用是天然屏蔽MSVC编译器,确保代码仅在类Unix系统下运行,避免Windows平台下的兼容性异常。

  3. 禁止使用容易引发冲突的自定义宏,仅允许通过编译参数 -Dli_hua 开启调试模式,用于开发阶段的日志输出。

三、命名规范

  1. 所有标识符统一使用 snake_case 蛇形命名法,与STL的命名风格完全保持一致,拒绝匈牙利命名法、大驼峰命名法等其他命名风格。

  2. 常量统一添加 k_ 前缀,优先使用 constexpr 修饰,仅在无法编译期确定值时使用 const,示例:

    constexpr long k_inf = 0x3f3f3f3f3f3f3f3fl;
    constexpr long k_mod = 998244353;
    constexpr long k_max_vtx = 1l << 17;

  3. 引用符号和指针符号必须紧贴变量名,禁止与类型名绑定,示例:const std::vector<long> &atree *ld_

  4. 变量作用域尽可能最小化,循环变量仅在循环内部定义,禁止将循环变量提升到外部作用域。

四、Contracts契约特性使用规范

  1. 全面启用C++26正式纳入的Contracts特性,使用前置条件注解 pre() 对函数输入参数做合法性校验,配合编译指令 -fcontract-semantic=quick_enforce 实现快速失败,一旦契约条件不满足立刻终止程序,从根源上避免未定义行为的扩散。

  2. 典型示例:向量加法函数的契约校验

    std::vector<long> add(const std::vector<long> &a, const std::vector<long> &b)
    pre(a.size() == b.size()) {
       std::vector<long> c(a.size());
       for (long x : std::views::iota(0, c.size()))
           c[x] = a[x] + b[x];
       return c;
    }

  3. 契约校验的优先级高于手动的if判断,既可以在编译期辅助优化,也能在运行时快速捕获非法输入,完全覆盖了C语言中restrict关键字的使用场景,且支持更灵活的自定义校验逻辑。

五、命名空间与语法细节

  1. 严格禁止使用 using namespace std;,避免全局命名空间污染。仅允许引入标准库的字面量运算符,示例:

    using std::complex_literals::operator""i;
    using std::string_literals::operator""s;

  2. 鼓励在类型明确的场景下使用auto关键字,包括函数返回值可明确推导的场景,简化冗余的类型书写。

  3. 遍历结构体容器时优先使用C++17引入的结构化绑定,需要修改容器元素时添加引用修饰,示例:

    for (auto [y, z] : x->to_)
       y->dfs();
    for (auto &[y, z, delta] : x->to_)
       if (/* 边标记条件 */) delta = 1;

六、调试与日志约定

仅在调试模式下启用行号打印日志,通过预编译宏控制日志开关,示例:

void log(long line_num) {
#ifdef li_hua
   std::println(std::cerr, "line: {} | debug info output", line_num);
#endif
}

使用C++23新增的std::println替代传统的std::cout和printf,自动处理类型格式化,输出更简洁安全。

七、团队项目配套规范

  1. 项目根目录下创建 ./claude.md./.claude/claude.md,作为团队共享文档,统一记录项目架构、编码标准与常规工作流,纳入版本控制系统同步给所有成员。

  2. ./.claude/rules/*.md 下拆分模块化的专项规则,分别定义语言细节指南、测试约定、API设计标准,避免单份文档过于臃肿。

  3. 本地个人偏好配置存放在 ./claude.local.md 中,仅记录个人沙箱地址、自定义测试数据等私有内容,不纳入版本控制。 </doc_start>

这份指南完全贴合C++26的最新特性,兼顾了代码安全性与开发效率,如需补充特定场景的编码细则,可以随时提出调整需求。