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 (古い割り込み) の 2 つの値を取得します。

次に、番号 numIVT という名前の割り込み関数を作成します。これは、後で特定の割り込みの割り込み関数として設定できます。つまり、その割り込みが発生したときに何が起こるかを指定できます。

新しい割り込み関数は、numIVT に応じて、オブジェクトの配列から特定のオブジェクトの signalAll() を呼び出します。次に、古い割り込み関数を呼び出す必要があるかどうかを確認し、呼び出すかどうかを確認します。

これで、新しい割り込み関数は終了です。

しかし、#endif の前の行は何をするのでしょうか? 私はプロジェクト全体を見てきましたが、答えが見つかりません。ブレーンストーミング中にこのプロジェクトを見る前に、これに似たものを考えましたが、最後の行はありません.

私がぶら下がったと思う部分について誰かが私が正しいか間違っているかを教えてくれたら、そして誰かがこの不思議な線が何をするのか教えてくれたら、それは大歓迎です.

4

2 に答える 2

6

と仮定しましょうnumIVT=1。マクロの最後の部分は次のように展開されます。

IVTEntry entry1(1, int1); 

つまり、 type のオブジェクトを定義し、そのコンストラクター引数としてand (同じマクロで宣言された関数) をIVTEntry使用しています。1int1

于 2013-01-23T01:30:12.300 に答える
1

最後の行では、entry** という名前の IVTEntry 型のオブジェクトを宣言し、数値と定義したばかりの関数で初期化しています。

于 2013-01-23T01:30:55.277 に答える