Разделите определенные ответвления #ifdef

Короче говоря: Я хочу генерировать два дерева другого источника от текущего, базирующегося только на одном определяемом макросе препроцессора и другой являющийся неопределенным, без других изменений в источнике.

Если Вам интересно, вот моя история...

В начале мой код был чистым. Затем мы сделали новый продукт, и да, это было лучше. Но код видел только те же периферийные устройства, таким образом, мы могли сохранить тот же код.

Ну, почти.

Был тот мало условия, которое должно было быть изменено, таким образом, я добавил:

#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif

... к одному и только одному исходному файлу. В общем all-source-files-include-this заголовочном файле я имел:

#if !(defined(PRODUCT_A)||defined(PRODUCT_B))
#error "Don't make me replace you with a small shell script. RTFM."
#endif

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

Все было хорошо. О... за исключением того, что модификации были сделаны, компоненты, измененные, и так как новые аппаратные средства работали лучше, мы могли значительно переписать системы управления. Теперь, когда я рассматриваю поверхность кода, существует больше чем 60 отдельных областей, очерченных также:

#ifdef PRODUCT_A
...
#else
...
#endif

... или то же, но для PRODUCT_B. Или даже:

#if defined(PRODUCT_A)
...
#elif defined(PRODUCT_B)
...
#endif

И конечно, иногда исправность брала более длительный отпуск и:

#ifdef PRODUCT_A
...
#endif
#ifdef PRODUCT_B
...
#endif

Эти условия переносятся где угодно от одной до двухсот строк (Вы думали бы, что последний мог быть сделан путем переключения заголовочных файлов, но имена функций должны быть тем же).

Это безумно. Я был бы более обеспеченным поддержанием двух основанных на отдельном продукте ответвлений в источнике repo и портирования любых общих изменений. Я понимаю это теперь.

Есть ли что-то, что может генерировать два дерева другого источника, на которых я нуждаюсь, базирующийся только PRODUCT_A будучи определенным и PRODUCT_B будучи неопределенным (и наоборот), не касаясь ничего больше (т.е. никакое включение заголовка, никакое макрорасширение, и т.д.)?

6
задан Brian Tompsett - 汤莱恩 24 February 2016 в 12:02
поделиться

1 ответ

Я считаю, что Coan сделает то, что вы ищете. Из ссылки:

Получив конфигурацию и некоторый исходный код, Coan может ответить на ряд вопросов о том, как исходный код выглядел бы для препроцессора C/C++, если бы эта конфигурация символов была применена заранее.

А также:

Исходный код, переписанный Coan, не является препроцессированным кодом в том виде, в котором его производит препроцессор языка Си. Он по-прежнему содержит комментарии, макрозапросы и #-директивы. Это все еще исходный код, но упрощенный в соответствии с выбранной конфигурацией.

Таким образом, вы можете запустить его дважды, указав сначала продукт A, а затем продукт B.

6
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: