Прекомпилированные константы
By exs. Sunday, January 13, 2008 8:29:45 PM
При написании прикладных программ на spf с использованием разнообразных внешних API приходится использовать множество констант определённых этими API. Обычно создатели API предоставляют заголовочные *.h файлы C/C++ которые можно сразу подключать и использовать. Мы же такой возможности лишены и поэтому приходится ручками задавать связь между символьным именем и числовым значением констант.
Можно конечно никаких лишних связей не задавать, а не мудрствуя лукаво в нужных местах использовать явное числовое значение подсмотрев в документации на API. Этот способ очень плох, т.к. разбирать и поддерживать такой код значительно сложнее.
Гораздо правильнее будет эту константу обьявить форт-словом с соответствующим именем
3 CONSTANT CURL_GLOBAL_ALL
Для небольших проектов этого вполне достаточно. Но при более интенсивном использованием API количество используемых констант растёт, а это влечёт за собой увеличение размера собранного exe - т.к. каждая константа представляется словом форта. При этом если константы складываются в отдельный файл - каталог констант - они подключается все вместе, хотя скорее всего далеко не все они используются в даном конкретном приложении.
Общепринятый способ решения этих проблем в SPF - использовать "прекомпилированные константы".
Общий принцип : файл описывающий константы загружается во временное хранилище, потом загруженные константы можно использовать, при этом в код компилируются сразу числовые значения - не ссылки на какие-то слова. При сохранении бинарника сам файл с константами в образ не попадает. Т.е. в compile-time константы есть, в runtime - нет. Это часто именно то что нужно.
Есть две библиотеки которые реализуют этот функционал.
~yz/lib/const.f.
Подключение - S" lib/win/winconst/windows.const" LOAD-CONSTANTS ( подключаются константы Windows)
Использование - W: WM_PAINT ( слово W: выбирает слово и ищет его в списке констант)
Удаление - REMOVE-ALL-CONSTANTS ( явно удаляет загруженные константы)
lib/ext/const.f
Подключение - S" ~ygrek/lib/data/opengl.const" ADD-CONST-VOC ( константы OpenGL)
Использование - GL_TRIANGLES ( расширяется NOTFOUND и поэтому имя константы автоматически распознаётся)
Удаление - REMOVE-ALL-CONSTANTS
Обе либы работают с одним форматом const файлов поэтому можно использовать любую (отличаются они как видно способом задания константы - явно или неявно). REMOVE-ALL-CONSTANTS вызывать необязательно т.к. динамическое хранилище всё равно не попадёт в собираемый бинарник, а структуры библиотек обнулятся при старте этого бинарника. Для ускорения поиска константы хранятся в виде двоичного дерева, так что с этим проблем нет.
В дистрибутиве SPF есть следующие готовые const файлы :
- ~yz/cons/windows.const
- ~yz/cons/commctrl.const
- ~yz/cons/sql.const
- ~day/wfl/controls/scintilla/scintilla.const
- ~ygrek/lib/data/scintilla.const
- ~ygrek/lib/data/farplugin.const
- ~ygrek/lib/data/opengl.const
- ~ygrek/lib/data/curl.const
- ~vsp/cons/mmedia.const
- lib/win/winconst/windows.const
Как самостоятельно создать const файл если нет готового?
[COLOR=darkblue]S" [/COLOR][COLOR=blue]~day/wincons/compile.f[/COLOR][COLOR=darkblue]"[/COLOR] [COLOR=darkblue]INCLUDED[/COLOR] BEGIN-CONST [COLOR=limegreen]1[/COLOR] [COLOR=darkblue]CONSTANT[/COLOR] [COLOR=darkblue]x[/COLOR] [COLOR=limegreen]2[/COLOR] [COLOR=darkblue]CONSTANT[/COLOR] [COLOR=darkblue]y[/COLOR] #define z [COLOR=limegreen]3[/COLOR] #define q [COLOR=limegreen]4[/COLOR] [COLOR=chocolate]\ etc[/COLOR] [COLOR=darkblue]S" [/COLOR][COLOR=blue]my.const[/COLOR][COLOR=darkblue]"[/COLOR] SAVE-CONST [COLOR=darkblue]BYE[/COLOR]
Думаю код в комментариях не нуждается. #define это тот же CONSTANT.
Для облегчения переноса констант из сишных файлов есть утилитка ~day/wincons/h2f.f, которая позволяет довольно быстро в полуавтоматическом режиме конвертировать h-файлы.







Ilya73 # Monday, January 14, 2008 8:41:56 PM
exs # Saturday, January 26, 2008 10:41:36 AM
А как с расширяемостью? Т.е. чтобы добавить новых констант надо пересобирать wincon.dll?
Anonymous # Sunday, June 7, 2009 6:52:46 PM