9.6 Упражнения |
Предыдущая Содержание Следующая |
Макрос Class() является более эффективным, переносимым решением для автоматической инициализации описаний классов, чем использование функций. Это реализовано изменением отчётов, определений классов и прикладных программ так, как описано выше. munch, вероятно, придётся адаптировать к новой системе. Для выпускаемой версии системы мы можем при использовании совместно с макросом Class() удалить условие из макроса и инициализировать все описания класса с помощью munch. Как проинициализировать всё в правильном порядке? Может ли помочь здесь использование ooc (справьтесь в руководстве в приложении C об опции -M для ooc)? Что можно сказать о cast() в выпускаемой версии системы? Все описания классов должны сначала обнаружиться в вызовах cast(). Мы можем определить поддельный класс
typedef const void * (* initializer) (void);
% Class ClassInit: Object { initializer init; %}
и использовать статически инициализируемые экземпляры как "неинициализированные" описания классов:
static struct ClassInit _Point = { { MAGIC, 0 }, /* Объект без описания класса */ initPoint /* функция инициализации */ };
const void * Point = & _Point;
cast() может теперь обнаружить описание класса с нулевым указателем описания класса, предположить, что это struct ClassInit, и вызвать функцию инициализации. Хотя это решение сокращает количество ненужных вызовов функции, как это повлияет на использование cast()?
|
Предыдущая Содержание Следующая |