2013-08-06 2 views
4

Как предварительно обработать базу кода с помощью препроцессора clang (или gcc), ограничивая его текстовую обработку, чтобы использовать только #define записи из одного файла заголовка?Как ограничить объем используемых определений предварительной обработки?

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

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

#if __has_feature(XYZ) 
# define JX_FOO(_o) new_foo(_o) 
# define JX_BAR(_o) // nop 
... 
#else 
# define JX_FOO(_o) old_foo(_o) 
# define JX_BAR(_o) old_bar(_o) 
... 
#endif 

Конкретный пример представляет собой набор кода Objective-C, который был перенесен, чтобы быть АРК-совместимый (Автоматический подсчет ссылок) из эксплуатации управления памятью (не-ARC), используя набор макросов (https://github.com/JanX2/google-diff-match-patch-Objective-C/blob/master/JXArcCompatibilityMacros.h), так что он компилирует оба пути позже.

В какой-то момент вы хотите отказаться от поддержки без ARC для повышения удобочитаемости и ремонтопригодности.

Edit: Основанием для получения вывода препроцессора описано здесь: C, Objective-C preprocessor output

Edit 2: Если кто-то имеет информацию о том, как источник-источник вариантов преобразования в Xcode реализуются (Edit> Рефакторинг> Преобразовать в ...), которые могут помочь.

ответ

0

Это немного глупое решение, но оно работает: видимо, вы можете использовать рефакторинг AppCode для удаления использования макроса.

Это ограничивает решение OS X. Это также немного утомительно, потому что вы должны сделать это вручную для каждого JX_FOO() и JX_BAR().

0

Если вы пишете файл с нуля или все включает в себя в одном месте, то почему бы не завернуть их внутрь:

#ifndef MACRO_DEBUG 
    #include "someLib.h" 
    /* ... */ 
#endif 

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

+0

Если бы я сделал это для своих макросов, это привело бы к тому, что я хочу. Если я сделаю это для всех немакробных файлов, источники будут беспорядочными, и результат все равно содержит все неявно включенные заголовки (даже если я временно перехожу на этот маршрут). – JanX2

+0

Нет другого чистого способа, о котором я знаю. Возможно, создайте файл, который включает только другие файлы, включая все включенные туда, а затем включите его внутри '#ifndef ... # endif' (или просто закомментируйте включение этого файла, когда это необходимо). – Kelm

+0

На самом деле мне не нужен способ C. Что мне нужно - это способ (неверно) использовать препроцессор C определенным образом. – JanX2

0

Это идеальный вариант для sed/awk. Однако существует еще лучший инструмент, доступный для конкретного случая использования, о котором вы упоминаете. Оформить заказ coan.

для предварительной обработки исходного файла, как если символ <SYMBOL> определен,

$ coan source -D<SYMBOL> sourcefile.c 

Аналогично для предварительной обработки исходного файла как если символ <SYMBOL> не определен,

$ coan source -U<SYMBOL> source.c 
+0

coan выглядит точно так же, как я имел в виду! Я проверю его и отчитаю. :) – JanX2

+0

Я попытался построить coan на OS X, но столкнулся с проблемами. Как только они будут прояснены, я дам кону. – JanX2

+0

@ JanX2 Я поддерживаю коён. Я не поддерживаю его для OS X, но есть пользователи OS X. Один из них недавно сообщил мне, что для сборки v5.1.2 для OS X 10.8 он должен был: «Изменить AM_CXXFLAGS на -std = C++ 11 -stdlib = libC++; установить CPP11_HAVE_MATURE_UNIQUE_PTR на 0." –