У меня есть два файла из программы C. Я предполагаю, что оба принадлежат к одной и той же версии. Используя «diff», я мог узнать, где находятся различия, которые, вероятно, состоят из 3 строк. Проблема в том, что второй файл был передан другому программисту, который использовал совершенно другую индексацию, стиль скобок и т. д., но, вероятно, изменил только те 3 строки, которые мне нужно найти. Если я использую «diff», я получаю много различий. Итак, мой вопрос в том, как я мог в этой ситуации узнать, в чем различия с точки зрения кода. Я попытался применить одинаковое форматирование к обоим файлам, а затем использовать «diff», но в моем случае это не работает.
Знать различия двух версий кода с очень разным форматированием
Ответы (3)
Вы можете использовать нашу программу SmartDifferencer. Он сравнивает два файла кода, анализируя их с помощью реального синтаксического анализатора (что делает его полностью независимым от форматирования и размещения или изменений в комментариях), сравнивая синтаксические деревья, а затем сообщая об изменениях с точки зрения действий редактирования (копировать, перемещать, вставлять, расширять). -переменная-внутри-блока), которые объясняют, что произошло. Таким образом, вы видите различия в языковых структурах, а не в строках, что часто дает гораздо меньшие результаты различий. Он даже игнорирует изменения в системе счисления и экранировании строк, если фактические литеральные значения совпадают.
Для таких языков, как C# и Java, это работает очень хорошо. C немного более проблематичен, так как люди пишут оскорбительный код C, который нельзя проанализировать, не зная всех определений, #include и т. д. Таким образом, он не будет обрабатывать некоторые файлы, и вам придется вернуться к обычному diff, возможно, дополненному форматер, как предложил другой автор, но это все равно даст вам только линейные различия. C++, возможно, имеет те же проблемы, что и C, но на практике код C++ не так оскорбителен.
Используйте pretty-printer для форматирования обоих файлов, а затем выполните сравнение.
diff
принимает параметр -w
, который указывает ему игнорировать все пробелы при сравнении строк. Однако, если возможно, что одна строка из одного файла была разделена на две или более строк в другом файле, вам, вероятно, лучше воспользоваться предложением @Jeff Foster.