Инструмент для удаления/применения ifdef's/else из базы кода

У меня довольно большая база кода, и я хотел ее очистить, удалив и применив некоторый ifdef, рассеянный вокруг него. Например, у меня их много:

test.c

#ifdef MYCHECK
    // do other sutff
#else
    // do stuff
#endif

Есть ли инструмент, который позволяет мне запускать всю кодовую базу и удалять весь этот код, оставляя только код внутри моего условия переменной? Например:

nicetool -D MYCHECK *.c

Результат:

test.c

// do other stuff

Ответ 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-директивы, дифференцируют прогрессивные выпуски или параллельные варианты продукта. В этих настройках содержание дерева конфигурации продукта может стать затруднительным, а количество дефектов, связанных с конфигурацией, может стать дорогостоящим.