Мне известны два инструмента, которые вы могли бы использовать для полуавтоматической работы.
Один - sunifdef
(сын unifdef
). AFAIK, это больше не поддерживается (хотя и не является unifdef
, на котором оно основано).
Другой - coan
, который активно поддерживается и является развитием sunifdef
.
См. Также: Существует ли препроцессор C, который исключает блоки #ifdef
на основе значений, определенных / неопределенных? .
Как это происходит, я все еще использую sunifdef
в основном проекте на работе, где я удаляю архаичный код (например, машины, которые не поддерживаются примерно с 1996 года) из базы кода. Единственное, что у меня есть, это то, что если в скобках есть строка, подобная этой:
#if (defined(MACH_A) && defined(PROP_P)) || (defined(MACH_B) && defined(PROP_Q)) || \
(defined(MACH_C) && defined(PROP_R))
и у нас -UMACH_C
(поэтому машина C больше не поддерживается), строка вывода:
#if defined(MACH_A) && defined(PROP_P) || defined(MACH_B) && defined(PROP_Q)
Технически это нормально; это правильно. Желательно, чтобы в выражении содержались лишние, технически избыточные скобки.
Одно предостережение: хотя я могу ответить за эти компиляции в системах на основе Unix, я лично не проверял их в Windows.