Вопрос

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

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

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

Спасибо!Саймон

Это было полезно?

Решение

Вы можете использовать что-то вроде 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;
    }

Другие советы

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

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

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

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

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

//%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

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

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

gcc <insert files here> -E

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

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

grep -r '#define CLIENT_CODE' ./*.h 

Вы также можете попробовать unifdef что гораздо проще, чем sunifdef.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top