0

私は今年の夏に NES エミュレーターを書いていて、障害に遭遇しました。ppu コードをテストしようとしていますが、循環依存が原因でコードをコンパイルできません。

私が現在持っているもの:

  • 3 つのクラス: cpu、ppu、およびメモリ
  • ヘッダー: cpu.h、ppu.h、および memory.h
  • cpp ファイル: cpu.cpp、ppu.cpp、memory.cpp、main.cpp

依存関係の問題は、memory.h にあります。現在、ppu.h には memory.h が含まれているため、VRAM にアクセスできます。また、memory.h には ppu.h が含まれているため、CPU がメモリに書き込む内容に応じて VRAM のフラグまたはアドレスを更新できます。ppu ポインタしか使っていないので、ppu クラスの前方宣言を試みましたが、失敗しました。

前方宣言を使用したコードの例で何が起こるかを次に示します。

case 0x2000:
ppu->ppuTempAddress |= ((data & 0x03) << 10);
break;

そしてエラー:

In file included from memory.cpp:1:0:
memory.h:7:7: error: forward declaration of ‘class ppu’
memory.cpp:99:10: error: invalid use of incomplete type ‘class ppu’

include "ppu.h" は次のエラーを出力します (インクルードなしでは発生しません):

In file included from memory.h:6:0,
                 from memory.cpp:1:
ppu.h:13:20: error: ‘memory’ has not been declared
ppu.h:63:25: error: ‘memory’ has not been declared
ppu.h:66:29: error: ‘memory’ has not been declared

ここから何をすべきかについて何か提案はありますか?私は困惑しています。

4

3 に答える 3

0

このような問題は、コンパイラが完全な宣言を確認していないときに、前方宣言された型を使用することから発生します。前方宣言は、コンパイラに「この型が存在する」ことを伝えるだけです。

完全なコードは表示されていませんが、ヘッダー ファイルに実行可能コードが含まれていると思われます。それを取り出して、すべての実行可能コードを .cpp ファイルに入れます。

于 2013-08-15T06:08:31.970 に答える
0

物事をインライン化したい場合:

A.h
  #ifndef A_H
  #define A_H
  class A {};
  #include "A.hcc"
  #endif

A.hcc
  #ifndef A_H
  #error Please include A.h, instead.
  #endif
  #include "B.h"
  // inline functions 
  ...

B.h
  #ifndef B_H
  #define B_H
  class B {};
  #include "B.hcc"
  #endif

B.hcc
  #ifndef B_H
  #error Please include B.h, instead.
  #endif
  #include "A.h"
  // inline functions 
  ...
于 2013-08-15T07:38:17.637 に答える