编译错误,在单行上使用comment / debug / uncomment / debug消失

时间:2013-04-25 23:49:49

标签: c++ visual-studio-2010 compiler-errors

以下是我程序中的头文件。 我收到编译错误,说我在partyPack之前错过了一个分号。 没有遗漏。还有其他两个错误,但我不记得它们是什么。

对我来说真正令人困惑的是我发表了Pack partyPack的评论;编译(失败,因为它在.cpp中引用),当我取消注释并再次尝试时,它编译并运行。

什么可能导致这种行为?

#ifndef PARTY_INTERFACE
#define PARTY_INTERFACE

#include "utility.h"
#include "Pack.h"
#include "Shop.h"
#include "Assets.h"

struct member
{...};

class Party
{
private:
    const static int TEAMSIZE = 4;
    member team[TEAMSIZE];
    Pack partyPack;
    const Inventory* itemList;
public:
    Party(const Inventory* inputList);
    void newTeam();
    bool load();
    bool save();
    void findItem();
    const void showParty();
    const void showInventory();
    void addToInventory();
    ~Party(void);
};

#endif

更新1 我能够复制错误...... 下面是一个github repo的链接,其中包含程序的文件供参考,随意下载和调试等。最后一次提交在VC ++ 2010中为我编译。我已经注释掉了需要windows.h的部分,它是普遍编译......我希望。

https://github.com/dsball/RPGShop/tree/master/RPGShop

更新2 我已将问题隔离到Party.h中包含的一个头文件或Party.h本身中的某些内容发生了变化。输入int的简单行为;并立即删除它(这两个步骤之间没有任何内容)导致错误。错误如下:

错误1错误C2146:语法错误:缺少';'在标识符'partyPack'party.h 30之前

错误2错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int party.h 30

错误3错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int party.h 30

然后我在Pack.h中对第30行进行评论// Pack partyPack,编译/开始调试(失败),取消注释同一行并重试,它运行得很好。

更新3 在学习了Pack()编译指示后,我已经用背包替换了Pack,但问题仍然存在。

正如其他人所提到的那样,似乎有些东西干扰了Party的定义,但我找不到它的含义。

2 个答案:

答案 0 :(得分:2)

(在以后的版本中,pack已经重命名为背包。这个答案用'背包'代替'pack')

在G ++下编译时(经过适当修改以删除特定于Windows的代码后),我收到此错误:

$ g++ -std=c++0x *.cpp
In file included from Shop.h:6:0,
             from Backpack.h:5,
             from Backpack.cpp:1:
Party.h:30:2: error: ‘Backpack’ does not name a type

看起来问题是Backpack.h包含party.h,但在Backpack.h的第5行,背包类尚未定义。 Party.h在第5行包含Backpack.h,但由于已经包含了Backpack.h,#ifndef语句会阻止Backpack.h第二次被包含(否则会创建一个无限循环的#include语句)。

总之,看起来这个问题是由于循环依赖性造成的。我会找到一种方法来打破Backpack.h和Party.h之间的依赖循环。

就为什么这是片状的,我猜测VC缓存完全加载的头作为优化。如果Backpack.h已经满载,则不会发生此错误。

答案 1 :(得分:1)

很可能Pack未定义。但是有一个标题存在可能定义它,所以...是否在另一个名称空间中定义? (您可能需要使用显式命名空间定位器,如pack_namespace :: Pack partyPack;)