1

我有一个大型游戏引擎要编译,它运行良好,直到我做了一些疯狂的调整。编译器不知何故无法重新调整我的平均 Game 对象并产生error C2061: syntax error : identifier 'Game',而且似乎无论我编译什么文件,错误总是指向一个名为的文件,GameDataLoader.h即使这两个文件绝对没有联系。通常我认为这是一个包含问题,但事实是我已经Game.h包含在每个必要的 .h 文件中,就在包含 stdafx.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(或等效的包含保护)将意味着一个标题将在另一个之前包含,并且第二个的声明将不适用于第一个。它不会神奇地将它们都包含在彼此之前,因为这是不可能的。

幸运的是,GameDataLoader.h不需要 的完整定义Game,因为它只处理指向它的指针。因此,您可以删除包含Game.h并只声明class Game;

于 2013-01-21T17:50:54.957 回答