错误C2061:语法错误:标识符,但已包含头文件

时间:2013-01-21 17:43:03

标签: c++ syntax-error identifier

我有一个很棒的游戏引擎可以编译,它运行正常,直到我做了一些疯狂的调整。编译器以某种方式无法重新构建我的平均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行中确实存在错误。可能是什么问题? 双重包含?圆形包含?或者没有包含某些东西和其他地方?

1 个答案:

答案 0 :(得分:11)

最有可能的是,Game.h包括GameDataLoader.h,直接或间接地创建循环依赖;但你忘了向我们展示Game.h,所以我无法确定。

如果是这种情况,那么#pragma once(或等效的包括警卫)将意味着其中一个标题将被包含在另一个之前,而第二个标题的声明将不可用于第一个标题。它不会在彼此之前神奇地包含它们,因为那是不可能的。

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