Estou procurando um aplicativo que possa comparar duas fontes C ++ e encontrar as diferenças significativas de código (para comparar versões que podem ter sido reformatadas de maneira diferente). No mínimo, algo que tenha a capacidade de ignorar alterações em espaços em branco, espaços de tabulação e novas linhas que não afetem a funcionalidade da fonte (observe que se uma nova linha é considerada espaço em branco depende do idioma , e C e C ++ o fazem ) E, idealmente, algo que possa identificar exatamente todas as diferenças significativas de código. Estou no Ubuntu.
De acordo com diff --help | grep ignore
, eu esperava diff -bBwZ
fazer o trabalho razoavelmente (esperava obter alguns negativos negativos, para ser tratado mais tarde). No entanto, não.
se eu tiver os seguintes arquivos com trechos
test_diff1.txt
else if (prop == "P1") { return 0; }
e test_diff2.txt
else if (prop == "P1") {
return 0;
}
então
$ diff -bBwZ test_diff1.txt test_diff2.txt
1c1,3
< else if (prop == "P1") { return 0; }
---
> else if (prop == "P1") {
> return 0;
> }
em vez de resultados vazios.
O uso de um formatador de código como um "filtro" em ambas as entradas pode filtrar essas diferenças, mas a saída resultante teria que ser vinculada às entradas originais para o relatório final das diferenças para manter o texto e os números de linha reais. Portanto, o objetivo é atingível sem a necessidade de um compilador corretamente ... Não sei se há algo disponível.
O objetivo pode ser alcançado diff
?
Caso contrário, existe uma alternativa (preferencialmente, para linha de comando)?
fonte
Em situação semelhante, quando precisei comparar duas
git
ramificações de forma independente de formatação de código, fiz o seguinte:ramificações temporárias criadas:
formatou os dois ramos usando
clang-format
:fez comparação real:
(
-w -b
permite ignorar a diferença de espaço, apenas por precaução).Pode preferir
uncrustify
sobreclang-format
(uncrustify
'smod_full_brace_if
podem ser utilizados para aplicar a inserção / remoção de chavetas ao redor de uma única linhaif
de corpo).Além disso, se o GNU
parallel
não estiver instalado, usexargs
- ele faz o mesmo, mas um pouco mais.fonte