3

我正在做一个项目,并使用过去几年的项目来帮助我获得关于如何做某些事情的想法。请注意,我不是盲目地抄袭,而是书中没有很多东西。无论如何,这是我不明白的宏:

#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 之前的行是做什么的?我一直在寻找整个项目,但找不到答案。在头脑风暴期间看这个项目之前,我想到了类似的东西,但没有最后一行。

如果有人能告诉我我认为我被挂断的部分是对还是错,如果有人能告诉我这条神秘的线是做什么的,那将不胜感激。

4

2 回答 2

6

让我们假设numIVT=1。宏的最后一部分将扩展为:

IVTEntry entry1(1, int1); 

这意味着您正在定义一个 type 的对象IVTEntry,并使用1and int1(在同一宏中声明的函数)作为其构造函数参数。

于 2013-01-23T01:30:12.300 回答
1

最后一行是声明一个名为 entry** 的 IVTEntry 类型的对象,并用一个数字和刚刚定义的函数对其进行初始化。

于 2013-01-23T01:30:55.277 回答