2010-03-18 2 views
3

Предыдущий программист предпочел генерировать большие таблицы поиска (массивы констант) для экономии времени циклов процессора, а не вычисления значений «на лету». Он сделал это, создав собственные проекты Visual C++, которые были уникальны для каждой отдельной таблицы поиска ... которые генерируют файлы массивов, которые затем включаются в полностью отдельный проект микроконтроллера ANSI-C (Renesas).Создание массива времени компиляции для ANSI-C?

Этот подход подходит для его первоначальных предположений расчета, но стал утомительным, когда входные параметры необходимо изменить, требуя от меня перекомпилировать все проекты Visual C++ и повторно импортировать эти файлы в проект ANSI-C. То, что я хотел бы сделать, это передать исходный код Visual C++ непосредственно в проект микроконтроллера ANSI-C и позволить компилятору создавать таблицы массивов.

Итак, мой вопрос: могут ли компиляторы ANSI-C вычислять и генерировать поисковые массивы во время компиляции? И если да, то как мне это сделать?

Заранее благодарим за вашу помощь!

+1

Не можете ли вы просто автоматизировать этот процесс, например. с скриптом сборки и/или вложенными проектами? –

ответ

4

Есть ли причина, по которой вы не можете импортировать свою архитектуру генерации кода в свою систему сборки?

Я имею в виду, в сделать я мог бы рассмотреть что-то вроде:

TABLES:=$(wildcard table_*) 
TABLE_INCS:=$(foreach dir,$TABLES,$dir/$dir.h) 
include $(foreach dir,$TABLES,dir/makefile.inc) 

$MAIN: $(SRS) $(TABLE_INCS) 

где каждый table_* содержит полный проект генерации кода, единственной целью которых является Тхо построить table_n/table_n.h. Также в каждом каталоге таблицы фрагмент файла файла с именем makefile.inc, который предоставляет строки зависимостей для сгенерированных файлов include, и теперь я удалил рекурсию.

сделано правильно (и эта реализация не закончена, отчасти потому, что точка яснее этот путь, но главным образом потому, что я ленивый), вы можете редактировать table_3/table_3.input, тип make в главном каталоге и получить table_3/table_3.h перестроен и программа поэтапно перекомпилирована.

+0

Это, безусловно, один подход, который я мог бы предпринять. Таким образом, по вашему опыту, сам компилятор не может генерировать вычисленные данные массива, поэтому мне нужно полагаться на внешние скриптовые механизмы или двоичные файлы, чтобы выполнить работу? Могут ли какие-либо директивы/макросы препроцессора вычислять такие таблицы? – multiproximus

+0

@multiproximus: Иногда вы можете что-то сделать с препроцессором, но если я прочитаю вопрос, ваш унаследованный код будет иметь схему генерации рабочего кода, нет? Идея здесь состоит в том, чтобы воспользоваться этим. Поэтому я бы хотел, чтобы система сборки работала с генерацией кода, но вы не сказали, что используете, чтобы управлять своей сборкой (делать это вручную, встроить ide, make, scons и т. Д.). – dmckee

1

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

0

Проверьте библиотеку препроцессора Boost. Это написано для C++, но, насколько мне известно, два препроцессора в значительной степени идентичны, и он может делать такие вещи.

Смежные вопросы