Я делаю проект и использую проекты прошлых лет, чтобы помочь мне получить идеи о том, как делать определенные вещи. Обратите внимание, что я не копирую бездумно, но есть много вещей, которых нет в книге.
Во всяком случае, вот макрос, который я не понимаю:
#define PREPAREENTRY(numIVT,oldINT) \
void interrupt int##numIVT(...){\
IVTEntry::entries[##numIVT]->signalAll();\
if (oldINT) IVTEntry::entries[##numIVT]->callOld();}\
IVTEntry entry##numIVT(##numIVT,int##numIVT);
#endif
Я не совсем уверен, но я думаю, что я понял большинство из них. Таким образом, PREPAREENTRY получает два значения: numIVT (число в таблице IV) и OldNT (старое прерывание).
Затем он создает функцию прерывания с именем numIVT, которую я позже могу установить в качестве функции прерывания для определенного прерывания, или что происходит, когда появляется это прерывание.
Новая функция прерывания вызывает signalAll () определенного объекта из массива объектов в зависимости от numIVT. Затем он проверяет, должна ли она вызывать старую функцию прерывания, и вызывает ее или нет.
Это конец новой функции прерывания.
Но что делает строка перед #endif? Я искал весь проект и не могу найти ответ. Прежде чем посмотреть на этот проект во время мозгового штурма, я подумал о чем-то похожем на это, но без последней строчки.
Если бы кто-то мог сказать мне, прав ли я или нет в отношении деталей, я думаю, что меня отвлекли, и если бы кто-то мог сказать мне, что делает эта таинственная линия, это было бы очень признательно.
Давайте предположим, numIVT=1
, Эта последняя часть макроса будет расширена до:
IVTEntry entry1(1, int1);
Это означает, что вы определяете объект типа IVTEntry
и используя 1
а также int1
(функция, объявленная в том же макросе) в качестве аргументов конструктора.
Последняя строка объявляет объект типа IVTEntry с именем entry ** и инициализирует его числом и только что определенной функцией.