1

コンパイルする大きなゲームエンジンがあり、クレイジーな調整を行うまでは問題なく動作しました。コンパイラはどういうわけか私の平均的なゲームオブジェクトを再構成して生成することができず、error C2061: syntax error : identifier 'Game'どのファイルをコンパイルしてGameDataLoader.hも、この2つのファイルとの接続がまったくない場合でも、エラーは常に呼び出されたファイルを指しているようです。通常、これは包含の問題だと思いますが、実際にはGame.h、stdafx.hを含めた直後に、必要なすべての.hファイルに含めており、その#pragama once上にあります。循環包含問題について考えましたが、#pragma onceその世話をする必要があります。さらに、この包含ディレクティブは、ファイル名やその他の厄介なものを変更するまでは正常に機能します。ソリューション全体をクリーンアップして再構築しようとしましたが、それでもうまくいきませんでした(VS2012を使用)。コードを表示することが役立つかどうかはわかりませんが、ここにのコードがありますgameDataLoader.h。これは私が書いたファイルではありませんが、正しく動作するはずです。

#pragma once
#include "stdafx.h"
#include "Game\Game.h" // Game.h included

class GameDataLoader
{
public:
    GameDataLoader(){} 
    ~GameDataLoader(){}

void GameDataLoader::loadGameProperties( Game *game, map<wstring, wstring> *properties, wstring gameInitFile);

    virtual void loadGame(Game *game, wstring gameInitFile) = 0;
    virtual void loadGUI(Game *game, wstring guiInitFile) = 0;
    virtual void loadWorld(Game *game, wstring levelInitFile) = 0;
};

そして、Gameオブジェクトの4行で正確にエラーが発生しました。何が問題になる可能性がありますか?ダブルインクルージョン?循環包含?または何かとどこかに含まれていませんでしたか?

4

1 に答える 1

12

最も可能性が高いのGame.hGameDataLoader.h、直接的または間接的に循環依存関係を作成することです。しかし、あなたは私たちに見せることを忘れていたGame.hので、私はそれを確信できません。

その場合、#pragma once(または同等のインクルードガード)は、ヘッダーの1つが他のヘッダーの前にインクルードされ、2番目の宣言が最初のヘッダーで使用できないことを意味します。それは不可能なので、魔法のように両方を前に含めることはありません。

幸いなことに、それはそれへのポインタのみを扱うのでGameDataLoader.h、の完全な定義は必要ありません。Gameしたがって、の包含を削除して、代わりGame.hに宣言することができます。class Game;

于 2013-01-21T17:50:54.957 に答える