我正在做一个项目并使用过去几年的项目来帮助我了解如何做某些事情的想法。请注意,我没有盲目地复制,但书中没有很多东西。 无论如何这是我不理解的宏:
#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的中断函数,我可以将其设置为某个中断的中断函数,或者当该中断出现时会发生什么。
新的中断函数根据numIVT从一个对象数组中调用某个对象的signalAll()。然后它检查它是否应该调用旧的中断函数并调用它。
这是新中断函数的结束。
但是#endif之前的那条线是做什么的?我一直在寻找整个项目,但找不到答案。在头脑风暴期间看这个项目之前,我想到了类似的东西,但没有最后一行。
如果有人能告诉我这些部件我是对还是错,我想我会挂掉,如果有人能告诉我这条神秘的线路是什么,我将不胜感激。
答案 0 :(得分:6)
让我们假设numIVT=1
。该宏的最后一部分将扩展为:
IVTEntry entry1(1, int1);
这意味着您要定义类型为IVTEntry
的对象,并使用1
和int1
(在同一个宏中声明的函数)作为其构造函数参数。
答案 1 :(得分:1)
最后一行是声明一个名为entry **的IVTEntry类型的对象,并用一个数字和刚刚定义的函数初始化它。