编译错误,注释/debug/uncomment/debug在一行上消失

Compile error that goes away with comment/debug/uncomment/debug on a single line

本文关键字:debug 一行 消失 错误 注释 uncomment 编译      更新时间:2023-10-16

下面是我的程序的头文件。我得到一个编译错误,说我在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本身包含的头文件之一中更改了某些内容。输入a的简单行为;立即删除它(在这两个步骤之间没有任何内容)会导致错误。错误如下:

错误1 C2146:语法错误:标识符"partyPack"前缺少";"

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

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

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

更新3 在学习有Pack() pragma后,我已经将Pack替换为Backpack,但问题仍然相同。

正如其他人提到的,似乎有什么东西干扰了Party的定义,但我找不到它是什么

(在以后的版本中,pack已重命名为backpack。这个答案用'backpack'代替'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行,Backpack类还没有被定义。Party.h在它的第5行包含了Backpack.h,但是因为Backpack.h已经被包含了,所以#ifndef语句阻止了Backpack.h第二次被包含(否则会创建一个#include语句的无限循环)。

总之,这个问题看起来是由于循环依赖。我会想办法打破Backpack.h和Party.h之间的依赖循环。

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

最可能的包未定义。但是有一个标头可能定义了它,所以…它是否定义在另一个名称空间中?(您可能需要使用显式的名称空间定位符,如pack_namespace::Pack partyPack;)