我正在寻找一个可以比较两个 C++ 源代码并找到代码意义差异的应用程序(以比较可能已重新格式化不同的版本)。至少,能够忽略不影响源功能的空格、制表符和换行符的变化的东西(请注意,换行符是否被认为是空格取决于语言,而 C 和 C++ 这样做)。而且,理想情况下,可以准确识别所有对代码有意义的差异。我在 Ubuntu 下。
根据diff --help | grep ignore
,我希望diff -bBwZ
能合理地完成这项工作(我希望得到一些假阴性,稍后再处理)。然而,事实并非如此。
如果我有以下带有片段的文件
test_diff1.txt
else if (prop == "P1") { return 0; }
和 test_diff2.txt
else if (prop == "P1") {
return 0;
}
然后
$ diff -bBwZ test_diff1.txt test_diff2.txt
1c1,3
< else if (prop == "P1") { return 0; }
---
> else if (prop == "P1") {
> return 0;
> }
而不是空的结果。
在两个输入上使用代码格式化程序作为“过滤器”可能会过滤掉这些差异,但随后必须将结果输出绑定回原始输入,以便最终报告差异以保留实际的文本和行号。因此,无需适当的编译器即可实现目标......不过,我不知道是否有可用的东西。
可以达到目标diff
吗?
否则,是否有替代方案(最好是命令行)?
您可以使用
dwdiff
. 来自man dwdiff
:程序非常聪明 - 请参阅
dwdiff --help
:测试它:
然后启动比较:
请注意
100% common
以上。我怀疑这是 diff 可以做的事情。如果一行内有空间变化,那么它将起作用(或其他类似的程序,如 kompare)。更糟糕的是,您可以执行搜索和替换和折叠制表符等。但是您要求的空格会超出一行...
您需要一个理解 C++ 语言的程序。请注意,所有语言都是不同的,特别是 Python 使用空格来定义代码块。因此,我怀疑任何通用的类似差异的程序都可以与“任何”(或特定的)编程语言一起使用。
您可能会考虑使用某种解析器来遍历两个源文件,然后比较该解析器的输出。
这超出了我的背景,但我建议您研究Lex和Yacc。这些是维基百科页面;你可能想看看这个页面,它给出了一个简明的解释和一个例子。
在类似情况下,当我需要以与
git
代码格式无关的方式比较两个分支时,我这样做了:创建临时分支:
使用以下格式格式化两个分支
clang-format
:做了实际比较:
(
-w -b
允许您忽略空间差异,以防万一)。您可能更喜欢
uncrustify
(clang-format
'uncrustify
smod_full_brace_if
可用于强制插入/删除单行if
主体周围的花括号)。parallel
此外,如果未安装GNU ,请使用xargs
- 它的作用相同,但时间长一点。