Как избавиться от ifdef в большом проекте c - PullRequest
5 голосов
/ 30 декабря 2011

Я получил в свои руки проект с открытым исходным кодом, закодированный в C . Он использует # ifdef для кросс-компиляции. Есть много ifdef по всему исходному коду. Я хочу просто изменить его для одной платформы. Я думал запустить его через препроцессор компилятора (Visual C ++), но он запишет предварительно обработанный результат в один файл, который мне не нужен. Кто-нибудь знает способ предварительной обработки проекта, оставив его структуру без изменений (все файлы без изменений)? Нет grep, пожалуйста.

редактирование:

Я нашел потенциальное решение (удивительно, что вы можете найти в Интернете в наши дни). Это boost.wave - библиотека препроцессора C ++, которая может делать некоторые интересные вещи. Я не знаю, как это получится, но я попробую. Тем не менее, это не окончательный ответ, поэтому, если у вас есть решение, я буду рад его услышать.

Ответы [ 2 ]

5 голосов
/ 30 декабря 2011

Мне известны два инструмента, которые вы могли бы использовать для полуавтоматической работы.

Один - 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.

3 голосов
/ 30 декабря 2011

Закомментируйте / удалите директивы #include, предварительно обработайте их, восстановите включения.

Разумеется, вам необходимо убедиться, что все макросы, используемые #ifdef, доступны.

...