← Back to skills
extension
Category: Productivity & OfficeAPI key requirement unconfirmed

移除 C++ 源码所有注释

批量移除 C++/C 源码中所有注释(// 与 /* */)的安全流程:词法状态机剥离、字符串字面量保护、备份、字节级重放验证、编译验证。用户要求\"删除注释\"\"移除注释\"\"清空代码注释\"时使用。"

personAuthor: Sxgx123hubOpenAPI

移除 C++ 源码所有注释

平台约定:本机主力环境是 Linux(Arch)——命令以 bash 为先、可直接执行;Windows 专属步骤一律收进「Windows(PowerShell)」小节,不在 Linux 段落里混用。

何时用

用户要求删除/移除/清空 C/C++ 项目中的全部注释(含 Windows bat 的 rem;Linux 侧同类的 .sh 注释见第 4 步)。

步骤

  1. 备份:无 git 时必须先备份,删除不可逆。

    Linux(bash)

    cp -r <src_dir> <src_dir>_备份_含注释
    

    Windows(PowerShell)

    Copy-Item -Recurse <src_dir> <src_dir>_备份_含注释
    
  2. 词法剥离器(Python,逐字符状态机):

    • 状态:普通 / 字符串 " / 字符字面量 '
    • 字符串或字符内:原样输出;遇 \ 转义则连下一字符输出并跳过;遇闭合引号退出状态
    • 普通态遇 //:跳过到行尾(while i < n and s[i] != '\n': i += 1)
    • 普通态遇 " 或 ':进入对应状态
    • 预处理命令不处理(#define 等不含 // 不受影响);R"(...)" 原始字符串需额外处理(先 grep 确认是否存在)
  3. 整行/行尾注释处理:

    • 整行只有注释(行内无代码)→ 删整行
    • 行尾注释 → 保留代码,删 // 到行尾,rstrip 行尾空白
    • 删除后压缩连续空行(2+ → 1),去文件首部空行,保证尾部单换行
  4. 脚本文件注释:

    • Windows bat:re.match(r"^\s*rem\b", ln) 删行(rem 是 bat 注释)
    • Linux shell:同类处理 ^\s*# 行;但 #! shebang 必须保留(首行 #!/usr/bin/env bash 不是注释),且 # 出现在参数/字符串里(如 ${var#prefix})不能删——不确定就别碰 .sh,本技能的主目标是 C/C++
  5. 验证(缺一不可):

    • 无残留:把字符串/字符字面量掩码为占位后,剩余文本逐行查 //
    • 零破坏:剥离器重放备份文件 → 与新文件字节级对比(这是唯一可靠对比;用正则提取字符串对比新旧会错位误报——注释里的字符串示例如 // cmd /k "cd /d 目录" 会被计入旧文件)
    • 编译:项目有 build 脚本时,构建到退出码 0(命令见下)
    • 运行时:跑一次产物确认中文输出完好

编译与运行时验证(第 5 步的命令)

Linux(bash)

make && echo "EXIT_CODE=$?"          # 或:bash build.sh; echo "EXIT_CODE=$?"
./<产物>                              # 跑一次确认中文输出完好

Windows(PowerShell)

cmd /c build.bat                     # 看 EXIT_CODE=0
.\<产物>.exe                         # 跑一次 exe 确认中文输出完好

坑

  • 字符串内 //(如说明文本、路径)绝不能删
  • 注释里的字符串字面量会污染新旧对比 → 用重放法而非提取法
  • 删注释后不压缩空行会留下成片空行,代码极丑
  • 交付时告知用户备份目录位置,确认后可删