Один из способов - использовать систему программной трансформации , чтобы "перезаписать" просто вызов макроса SID до того, что вы хотите, прежде чем выполнять компиляцию, оставляя оставшуюся часть препроцессора обработка самого компилятора.
Наш инструментарий реинжиниринга программного обеспечения DMS представляет собой такую систему, которая может применяться ко многим языкам, включая C и, в частности, к компиляторам серии GCC 2/3/4.
Чтобы реализовать эту идею с помощью DMS, вы должны запустить DMS с C внешним интерфейсом
над вашим исходным кодом перед этапом компиляции. DMS может анализировать код без расширения директив препроцессора , build
абстрактные синтаксические деревья, представляющие его, выполняют преобразования в AST, а затем выводят результат в виде скомпилированного текста на языке C.
Конкретное правило преобразования, которое вы бы использовали:
rule replace_SID_invocation(s:STRING):expression->expression
= "SID(\s)" -> ComputeCRC32(s);
где ComputeCRC32 - это пользовательский код, который делает то, что говорит. (DMS включает реализацию CRC32, поэтому пользовательский код для этого довольно короткий.
DMS является большим молотком для этой задачи. Вы можете использовать PERL для реализации чего-то похожего. Разница с PERL (или каким-либо другим способом сопоставления / замены строк) заключается в том, что а) он может найти шаблон где-то, где вы не не хотите заменить, например,
... QSID("foo")... // this isn't a SID invocation
, который вы, вероятно, можете исправить, тщательно кодировав совпадение с шаблоном, b) не соответствует вызову SID, найденному при неожиданных обстоятельствах:
... SID ( /* master login id */ "Joel" ) ... // need to account for formatting and whitespace
и c) не могут обрабатывать различные виды escape-символов, которые отображаются в самой литеральной строке:
... SID("f\no\072") ... // need to handle all of GCC's weird escapes
Передний конец DMS C обрабатывает все побеги для вас; Приведенная выше функция ComputeCRC32 будет видеть строку, содержащую действительные предполагаемые символы, а не необработанный текст, который вы видите в исходном коде.
Так что на самом деле все дело в том, заботишься ли ты о темных углах дел или думаешь, что у тебя может быть больше специальной обработки.
Учитывая то, как вы описали проблему, мне очень хотелось бы сначала пойти по маршруту Perl и просто запретить смешные случаи. Если вы не можете этого сделать, тогда большой молот имеет смысл.