Есть ли какой-либо рекомендуемый способ генерации кода, который подходит для замены макроса C?

Я только начал работать над большой базой устаревшего кода. Он имеет множество переменных и структур, названных в текстовом виде «файлом определения». Затем некоторые файлы заголовков будут включать эти файлы определения и использовать препроцессор C для создания объявления переменной и метода получения/установки.

Это вызывает огромную боль при работе и изменении полей. Кроме того, сигнатуры геттера/сеттера не генерируются до момента компиляции, поэтому для них также нет поддержки intellisense.

Я думаю сгенерировать код перед компиляцией и попросить другие модули включить сгенерированные файлы заголовков, а не включать заголовок на основе препроцессора. Я изучил Python + clang и добавил ключевое слово в язык C. Но оба они ошеломляющие, и я не знаю, с чего начать. Поэтому я хотел бы спросить о том, как люди порекомендовали бы решить эту проблему.

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

// in the definition file
NEWVARIABLE( point, int )

// in the preprocessor header file
#define NEWVARIABLE( name, type ) \
static type name;\
type LIBNAME_Get##name##(){return name ; }\
void LIBNAME_Set##name##( type _##name ){ name = _##name ; }

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


person Chun-Fu Chao    schedule 10.08.2012    source источник
comment
Код использует препроцессор C для предварительной обработки файла, который НЕ является допустимым кодом C, для создания фактических объявлений? Очевидно, первоначальный дизайнер считал это большим преимуществом. Вам что-то не хватает? (например, просто изменить файл not-C, чтобы внести изменения в поле?)   -  person Ira Baxter    schedule 10.08.2012


Ответы (5)


Может быть, вы можете просто запустить прекомпилятор (например, gcc -E с компилятором GCC), а затем вырезать и сохранить полученный текст. Не очень приятно, но автоматически улучшить его будет сложно.

person rodrigo    schedule 10.08.2012

Если вы используете GCC, то gcc -save-temps Code.c он сгенерирует предварительно обработанный файл как Code.i, и все макросы будут заменены здесь. (Не уверен, что вы хотите)

person perilbrain    schedule 10.08.2012

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

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

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

person Lundin    schedule 10.08.2012

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

Я бы не стал этого делать. Это не сломано и не плохо, просто вы не знакомы с техникой.

Если мой опыт работы с большим унаследованным кодом применим, у вас должно быть много возможностей улучшить вещи, которые бесспорно сломаны; работать на тех.

person AProgrammer    schedule 11.08.2012