Я взломал программу, которая сама создает программы моделирования в C. Пользователь определяет дизайн верхнего уровня, и эти программы вставляют небольшие C-фрагменты и клей-код helluvalot (несколько тысяч строк).Избегайте повторных замещений в предварительном процессоре C
Это делает местное именование по #defines
:
#define x local_x
#define vx local_vx
/* user code that uses x, ex */
vx = x/2
#undef vx
#undef x
Это примерно расширяется до следующего:
local_vx = local_x/2
НО если использовать структуры для local_*
-variables (оптимизировать на необходимости проходить 11 переменных для каждой отдельной функции ...):
#define x local->position.x
#define vx local->velocity.x
vx = x/2
#undef vx
#undef x
Wh ич получает расширен до
local->velocity.x = local->position.x
И - вот проблема - x
в скорости становится расширена снова:
local->velocity.local->position.x = local->position.x
Я не могу поставить скобки вокруг, так как он не имеет права назначать на переменные ((x) = 1
являются незаконными C, к сожалению ...). Любые намеки?
Обновление: Сгенерированное моделирование обычно весит от 15 до 20 000 LOC, и моделирование приблизительно на десять лет должно быть обратно совместимо с. Увы, просто переименование чего-то совсем не просто ... Поскольку, похоже, нет простого способа обойти эту конкретную проблему без какой-либо крупной реорганизации (я думал, что пропустил некоторые особенности C pre-processor), я решил сделать шаг назад и посмотреть, какие у меня есть другие варианты.
Препокорсор C и C++ не рекурсивен. – 2009-07-28 17:00:34
Спасибо! Изменено название для соответствия. –
Было много предложений по изменению семантики локального положения (имена членов или создания массива), но должна ли поддерживаться совместимость? – bdonlan