区分注释代码与有效注释
Distinguish commented code vs valid comments
我必须使用一个到处都有大量注释代码的项目。在引入任何更改之前,我想进行基本的清理并删除旧的未使用代码。
所以我可以使用这个公认的答案中的解决方案来删除所有评论,但是......
有合法的评论(不是注释的代码)可以解释事情。我不想删除它。例如:
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10; <- commented code
int k = 2*t;
仅应删除第 3 行。
分析代码和区分自然语言注释和注释代码行的可能方法是什么?
这是一种基本方法,但它提出了可以做什么的概念证明。我使用 Bash 以及 GCC-fsyntax-only
选项来做到这一点。
这是 bash 脚本:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
LINE=`echo $line | grep -oP "(?<=//).*"`
if [[ -n "$LINE" ]]; then
echo $LINE | gcc -fsyntax-only -xc -
if [[ $? -eq 0 ]]; then
sed -i "/$LINE/d" ./$1
fi
fi
done < "$1"
我在这里遵循的方法是从代码文件中读取每一行。然后,使用正则表达式(?<=//).*
grep
//
分隔符(如果存在)之后的文本,并将其传递给gcc -fsyntax-only
命令以检查它是否是正确的 C/C++ 语句。请注意,我已经使用参数-xc -
将输入从 stdin 传递给 GCC(请参阅我的答案 此处 了解更多信息)。一个重要的注意事项,-xc -
中的c
指定了语言,在这种情况下是 C,如果您希望它C++则应将其更改为-xc++
。
然后,如果 GCC 能够成功解析该语句(即,它是一个合法的 C/C++ 语句),我直接从传递的文件中使用sed -i
将其删除。
在您的示例上运行它(但在从第三行中删除<- commented code
使其成为合法语句之后):
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10;
int k = 2*t;
输出(在同一文件中):
// Those parameters control foo and bar... <- valid comment
int t = 5;
int k = 2*t;
(如果要将修改添加到其他文件中,只需从sed -i
中删除-i
即可)
该脚本可以像这样调用:./script.sh file.cpp
,它可能会显示几个 GCC 错误,因为这些是有效的注释。
更新。
相同逻辑的简化版本是:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
if [[ "$line" =~ [/]+.* ]]; then
$LINE=${line##*/}
echo ${$LINE} | gcc -fsyntax-only -xc - && sed -i "/$LINE/d" ./$1
fi
done < "$1"
你可以通过一些简单的正则表达式来获得大部分方法。基本上,在以下情况下,一行很可能不是代码:
- 它以一些或没有空格开头,
- 其次是
//
, - 后跟一些仅包含空格、字母、数字和基本标点符号的文本,
- 并且不以
;
结尾.
您可以为上述组合(或其反向组合)编写正则表达式,并大致了解有多少实际要删除的候选者。在 100k 行中,可能只有不到 1k 行与这个简单的过滤器匹配,这绝对在"可以手动通过它"的范围内。
我很可能会从搜索与w*//.*;
匹配的行开始,查看结果并确认可以删除所有这些行。此处的误报数应该非常低。请注意,这不会捕获被注释掉的多行语句。
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- Visual Studio 2019:插入多个C++风格的单行注释
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 区分注释代码与有效注释
- 为什么这个取消注释的宏在 clang 中无效,但在 msvc 中有效
- VS 2010 - #pragma 注释(lib,XX)有效,其他依赖项无效。为什么?