Ответ 1
Похоже, unifdef - это то, что вы хотите, оно также используется в ядре Linux. Это описание инструмента со связанного сайта (выделено мной):
Утилита unifdef выборочно обрабатывает условные препроцессоры С# # и #ifdef. Он удаляет из файла как директивы, так и дополнительный текст, который они ограничивают, в то время как в остальном он оставляет файл в отдельности.
Полезно избегать отвлекающих факторов при изучении кода, который сильно использует #ifdef для переносимости: моя первоначальная мотивация заключалась в понимании кода обработки xterm pty. Его можно использовать как легкий препроцессор; Например, ядро Linux использует unifdef для выделения разделов #ifdef _KERNEL_ из заголовков, которые он экспортирует в userland. Вы можете использовать unifdef с языками, отличными от C; например, UIT, издатель в Кембридже, где я живу, использует unifdef с LaTeX.
Если вы посмотрите руководство , есть некоторые исключения, перечисленные в разделе BUGS:
Обработка одной строки за раз означает, что директивы препроцессора разбиваются на
более чем одна физическая линия (из-за комментариев или обратной косой черты) не может обрабатываться в любой ситуации.
Триграфы не распознаются.
Нет поддержки макросов с различными определениями на разных точек в исходном файле.
Функциональность текстового режима и игнорирования не соответствует современным cpp (1).
Другие варианты включают Sunifdef, чей основной сайт больше не доступен и не обновлялся с 2008 года, и Coan: The C Preprocessor Chainsaw, который описывает себя как:
Coan - это инструмент разработки программного обеспечения для анализа конфигураций на основе препроцессора исходного кода на C или С++. Основное его назначение - упростить тело исходного кода, исключив любые части, которые являются избыточными по отношению к указанной конфигурации. Удаление мертвого кода - это приложение такого типа.
Coan наиболее полезен разработчикам постоянно развивающихся продуктов с большими базами кода, в которых используются определения препроцессора и # if-директивы, дифференцируют прогрессивные выпуски или параллельные варианты продукта. В этих настройках содержание дерева конфигурации продукта может стать затруднительным, а количество дефектов, связанных с конфигурацией, может стать дорогостоящим.