头文件编译多次,第一次编译后每次编译都会出现随机错误

Posted

技术标签:

【中文标题】头文件编译多次,第一次编译后每次编译都会出现随机错误【英文标题】:Header file compiles multiple times and gets random errors at every compile after the first compile 【发布时间】:2014-11-27 11:36:24 【问题描述】:

当我去构建我的 C++ 项目时,我得到了 53 个错误。但是,从我的项目中的 5 个头文件之一中,它连续 4 次出现相同的错误列表。我检查了输出,发现它试图编译那个头文件 5 次。看来第一次成功了。其他 4 次出错,但他们一遍又一遍地出现相同的错误。我遵循了导致的包括的地方。根据我包含该头文件的所有位置,每次包含该头文件时它都会尝试编译它是有道理的。

这是多次编译的头文件。第一次成功编译是有道理的,但我不明白为什么它在构建项目时每隔一次编译就会出现一堆错误:

#ifndef TRANSACTION_H
#define TRANSACTION_H

#include <string>
#include "Account.h"
#include "BSTree.h"

using namespace std;

class Transaction

public:
    Transaction();
    Transaction(char type, string firstName, string lastName, int ID, Account* account1, int fund1, Account* account2, int fund2, int amount);
    ~Transaction();
    void setPtrAccounts(BSTree* ptrAccounts);
    bool Transact();
private:
    static BSTree* ptrAccounts;
    char type;
    string firstName;
    string lastName;
    int ID;
    Account* account1;
    int fund1;
    Account* account2;
    int fund2;
    int amount;
    void Deposit();
    void History();
    void Open();
    bool Transfer();
    bool Withdraw();
;

#endif

这是重复的错误列表。这些错误完全是假的。上面头文件中的代码没有错:

错误 C2061:语法错误:标识符“帐户”\thejollybanker\transaction.h 14 1

错误 C2061:语法错误:标识符“BSTree”\thejollybanker\transaction.h 16 1

错误 C2143:语法错误:缺少 ';'在'*'之前 \thejollybanker\transaction.h 19 1

错误 C4430:缺少类型说明符 - 假定为 int。 \thejollybanker\transaction.h 19 1

错误 C2143:语法错误:缺少 ';'在'*'之前 \thejollybanker\transaction.h 24 1

错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int \thejollybanker\transaction.h 24 1

错误 C2143:语法错误:缺少 ';'在'*'之前 \thejollybanker\transaction.h 26 1

错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int \thejollybanker\transaction.h 26 1

以下是输出窗口的摘要:

Transaction.cpp

TheJollyBanker.cpp

Transaction.h 错误

基金.cpp

BSTree.cpp

Transaction.h 错误

银行.h

Transaction.h 错误

帐户.cpp

Transaction.h 错误

生成代码...

如何让它只编译一次,以便第一次编译成功?

【问题讨论】:

很难说它为什么会在没有更多上下文的情况下失败。但是,此标头不会自行编译。例如,这取决于使用的namespace std。因此,如果您在 using namespace std 语句之后包含此文件,它就可以工作。 【参考方案1】:

string 是命名空间std 的一部分。将 string 替换为该标头中的 std::string,然后它应该可以工作。

【讨论】:

到目前为止很好。我不敢相信我错过了。我现在减少到 37 个错误,因为它没有抱怨我在 Transaction.h 中使用的字符串。但是,您在错误列表中看到的我自己定义的类 Account.h 和 BSTree.h 导致的错误仍然存​​在。 循环头依赖?如果transaction.h 包含在Account.hBSTree.h 中,则Transaction 的类定义可以出现在AccountBSTree 之前。在这种情况下,在 class Transaction (class Account; class BSTree;) 之前直接声明 AccountBSTree。如果不是这样,我无法从您发布的代码中看到错误。 “循环依赖”。就是这样!在搜索其他 Stack Overflow 问题时,我找到了答案。本质上,每个包含都需要一个相应的类声明,并且每次使用包含的类都必须是引用或指针。我为五个类中的每一个都做了这个,现在它可以编译了。结案。谢谢你。 (我不知道我还能做些什么来提高你的声誉,但我已经接受了你的回答)。

以上是关于头文件编译多次,第一次编译后每次编译都会出现随机错误的主要内容,如果未能解决你的问题,请参考以下文章

VS2012 每次编译程序都会出现3个无法查找或打开 PDB 文件。

C++头文件理解

error c2572重定义默认參数

maven自己主动编译,解决你每次代码改动须要又一次编译的繁琐

maven自己主动编译,解决你每次代码改动须要又一次编译的繁琐

每次用eclipse编译java文件后,tomcat都会报错,然后自动重启,是啥原因