我有一个很棒的游戏引擎可以编译,它运行正常,直到我做了一些疯狂的调整。编译器以某种方式无法重新构建我的平均Game对象并生成error C2061: syntax error : identifier 'Game'
,似乎无论我编译什么文件,错误总是指向一个名为GameDataLoader.h
的文件,即使这两个文件完全没有连接。通常我认为这是一个包含问题,但事实是我在每个.h文件中都包含Game.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;
};
我在游戏对象的4行中确实存在错误。可能是什么问题? 双重包含?圆形包含?或者没有包含某些东西和其他地方?
答案 0 :(得分:11)
最有可能的是,Game.h
包括GameDataLoader.h
,直接或间接地创建循环依赖;但你忘了向我们展示Game.h
,所以我无法确定。
如果是这种情况,那么#pragma once
(或等效的包括警卫)将意味着其中一个标题将被包含在另一个之前,而第二个标题的声明将不可用于第一个标题。它不会在彼此之前神奇地包含它们,因为那是不可能的。
幸运的是,GameDataLoader.h
不需要Game
的完整定义,因为它只处理指向它的指针。因此,您可以删除包含Game.h
的内容,只需声明class Game;
。