Pre-препроцессор - PullRequest
       26

Pre-препроцессор

4 голосов
/ 15 сентября 2009

Я хочу иметь препроцессор C, который фильтрует некоторые операторы #define из исходного кода, ничего не меняя.

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

Кто-нибудь знает о существующем решении?

Спасибо! Simon

Ответы [ 8 ]

10 голосов
/ 15 сентября 2009

Вы можете использовать что-то вроде awk вместо CPP? Добавьте несколько флагов в ваш код, окружающих кусок кода, который нужно удалить. Например:

(...)
//BEGIN_REMOVE_THIS_CODE

printf("secret code");

//END_REMOVE_THIS_CODE
(...)

затем напишите сценарий awk для удаления этого кода, что-то вроде ...

BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
    {
    if(write==1) print $0;
    }
2 голосов
/ 15 сентября 2009

Это звучит как то, о чем я спрашивал в Есть ли препроцессор C, который устраняет блоки ifdef на основе значений, определенных . Лучший ответ, который я получил, был sunifdef, или «Сын unifdef», который надежно сработал для меня над каким-то чрезмерно искаженным условным кодом (накопленный за последние 20 лет разработки для широкого спектра платформ с неадекватной теорией как сделать платформу для конкретной компиляции).

1 голос
/ 15 сентября 2009

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

//%ifdef CLIENT_A
  code for client A
//%endif

//%ifdef CLIENT_B
  code for client B
//%endif

//%if "CLIENT_A" || "CLIENT_B"
  code for client A and B
//%endif

Префикс «//%» позволяет компилировать код без изменений. Вы можете запустить filepp до того, как Вы передадите код клиенту.

1 голос
/ 15 сентября 2009

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

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

1 голос
/ 15 сентября 2009

Я не думаю, что вам нужен препроцессор для этого. Если в вашем коде нет вложенных #ifdef, любой движок регулярных выражений может удалить все, что находится между #ifdef CLIENT и #endif (используйте сопоставление без жадности, чтобы сопоставить сначала #endif, а не последнее).

0 голосов
/ 19 января 2010

Вы также можете попробовать unifdef , что несколько проще, чем sunifdef.

0 голосов
/ 15 сентября 2009

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

0 голосов
/ 15 сентября 2009

Если вы используете gcc, то вы можете использовать:

gcc <insert files here> -E

Опция -E указывает gcc только на предварительную обработку источников, а не на их компиляцию.

Или вы можете использовать grep для фильтрации определенных файлов и позволить препроцессору проигрывать только на них.

grep -r '#define CLIENT_CODE' ./*.h 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...