【问题标题】:Compile error that goes away with comment/debug/uncomment/debug on a single line单行上的注释/调试/取消注释/调试消失的编译错误
【发布时间】:2013-04-25 23:49:48
【问题描述】:

下面是我程序中的一个头文件。 我收到一个编译错误,说我在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 存储库的链接,其中包含程序文件以供参考,随时下载和调试等。在 VC++ 2010 中为我编译的最后一次提交。我已经注释掉了需要 windows.h 的部分,它 应该普遍编译......我希望。

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

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

错误 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 //Pack partyPack 中注释第 30 行,编译/开始调试(失败),取消注释同一行并重试,它运行正常。

更新 3 在得知有 Pack() pragma 后,我已将 Pack 替换为 Backpack,但问题仍然存在。

正如其他人所提到的,似乎确实有一些东西干扰了派对的定义,但我找不到它是什么。

【问题讨论】:

  • 使用两个编辑器并让您的 IDE 没有意识到它需要重新保存文件可能会导致...
  • 这是所谓的 Heisenbug 的一种化身 :-)
  • @paxdiablo 呵呵。有问题,因为它似乎与我试图修复的另一个错误有关,当这个错误弹出时。很难说出我真正的错误在哪里。
  • 你能重现这个行为吗?还是曾经的怪事?
  • 听起来Pack 是未定义的。我和德鲁·多尔曼有同样的想法。您使用外部编辑器吗?

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


【解决方案1】:

(在以后的版本中,pack 已重命名为背包。此答案使用 '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 已完全加载,则不会出现此错误。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我只使用了声明,没有指令,所以除了定义它的 Pack.h 之外,我不知道它可能在什么命名空间中......
    • 呃...在.h中声明,在pack.cpp中定义
    猜你喜欢
    • 2013-03-11
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多