9.6 Упражнения

Предыдущая  Содержание  Следующая V*D*V

Макрос 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()?

 

Предыдущая  Содержание  Следующая