关键词:
【中文标题】头文件编译多次,第一次编译后每次编译都会出现随机错误【英文标题】: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.h
或BSTree.h
中,则Transaction
的类定义可以出现在Account
和BSTree
之前。在这种情况下,在 class Transaction
(class Account; class BSTree;
) 之前直接声明 Account
和 BSTree
。如果不是这样,我无法从您发布的代码中看到错误。
“循环依赖”。就是这样!在搜索其他 Stack Overflow 问题时,我找到了答案。本质上,每个包含都需要一个相应的类声明,并且每次使用包含的类都必须是引用或指针。我为五个类中的每一个都做了这个,现在它可以编译了。结案。谢谢你。 (我不知道我还能做些什么来提高你的声誉,但我已经接受了你的回答)。vs2013编程c++调试和生成老是出现问题,求救~~~
...个提示就是正常的。因为此项目已经过期表示你改了某些文件或项目配置或者上次没有编译成功,需要重新编译,否则调试会出错。如果你上次编译通过了,按F5调试还是出现此提示,那可能就有问题了。如果每次都出现这样的... 查看详情
stm32iar编译器头文件的问题?
例程中的一个文件我修改了下,编译出了问题,这是原来的路径设置我把Utilities文件夹改在工程文件的上一个文夹中(EWARM文件夹中是工程文件.eww)路径我改为保存修改后我编译,报错奇怪的是,从报错信息中可以看到它依在原... 查看详情
errorc2572重定义默认參数
...定义默认參数顾名思义。该默认參数被定义多次。在一个文件(或一个作用域)中,仅仅能为形參指定默认实參一次。在编译的时候会把头文件和源文件结合。就会出现多次指定默认形參的情况。因此我们仅仅须要在头文件。或... 查看详情
vs2012每次编译程序都会出现3个无法查找或打开pdb文件。
...“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开PDB文件。已加载“C:\Windows\SysWOW64\kernel32.dll”。无法查找或打开PDB文件。已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开PDB文件。VS2012每次编译程序... 查看详情
用vs2015写c++,编译报错项目已过期,怎么回事?
这个bug的原因是Visualstudio2010认为项目中的被删除的文件是过期的,比如项目中的某个头文件,这个头文件已经被删除,Visualstudio2010找不到这个头文件,就认为它是过期的,所以每次调试VS都认为项目是过期的,需要先编译。那... 查看详情
vs2013运行出现问题,编译不了,提示fatalerrorc1069:无法读取编译器命令行
求具体解决方案1头部#include文件错误,#include后面的包含的文件时,如果使用的是"<>"尖括号的话,表示让编译器在系统头文件夹中查找对应名字的头文件,当使用""引号时,就是让编译器在当前程序目录下查找对应... 查看详情
每次编译后第一次加载实体框架非常慢
】每次编译后第一次加载实体框架非常慢【英文标题】:Entityframeworkveryslowtoloadforfirsttimeaftereverycompilation【发布时间】:2015-08-0601:53:02【问题描述】:正如标题所示,我在使用实体框架对SQLServer数据库进行第一次查询时遇到问题... 查看详情
c语言头文件中放函数实体两个c文件同时引用会报错:找到一个或多个重定义的符号
c语言头文件中放函数实体两个c文件同时引用会报错:找到一个或多个重定义的符号为什么会报这个错在js中我可以将一个方法打包在一个外部的js中然后到处引用这个不是这样??C语言头文件中一般只进行函数声明,函数实现... 查看详情
#pragmaonce
#pragmaonce是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。#pragmaonce是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译... 查看详情
在 C/C++ 中多次包含头文件[重复]
】在C/C++中多次包含头文件[重复]【英文标题】:IncludingheaderfilesinC/C++morethanonce[duplicate]【发布时间】:2012-06-0407:03:19【问题描述】:在C或C++中多次包含头文件有用吗?如果从不使用该机制,为什么编译器会担心包含两次文件?... 查看详情
每次用eclipse编译java文件后,tomcat都会报错,然后自动重启,是啥原因
如果是删除掉tomcat文件以及eclipse中tomcat的配置,那么解决方法如下:重新去网上下载tomcat,压缩包形式的,解压就能用的。在eclipse中重新配置tomcat服务器,方法如下:点击window--showview-other找到servers点击OK然后在servers里面右键... 查看详情
c语言怎么调用头文件
自己定义的头文件,在里面写了个结构体,我要用的时候要怎么调用呢,文件放在编译器的目录下了已经,我是想问在写程序的时候怎么来用。。。。有2种方式#include"xxx.h"和#include<xxx.h>2种的区别通俗点说就是第一种... 查看详情
openharmony3.1release源码编译过rk3568后,编译hi3516标准系统,出现ramdisk报错解决方案(代码片段)
OpenHarmony3.1Release源码编译过rk3568后,如果再编译hi3516标准系统,会出现ramdisk报错解决办法:将build/ohos/images/mkimage/ramdisk_resource_config.ini的最后四行代码注释掉,就可以正常编译3516了。[board]boot_type=two_stagessource_path=../../ou 查看详情
openharmony3.1release源码编译过rk3568后,编译hi3516标准系统,出现ramdisk报错解决方案(代码片段)
OpenHarmony3.1Release源码编译过rk3568后,如果再编译hi3516标准系统,会出现ramdisk报错解决办法:将build/ohos/images/mkimage/ramdisk_resource_config.ini的最后四行代码注释掉,就可以正常编译3516了。[board]boot_type=two_stagessource_path=../../ou 查看详情
#pragmaonce含义及用法
#pragmaonce是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。#pragmaonce是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译... 查看详情
编译xsip过程中环境配置
...问题首先是出现了很多的error C1083。然后到XSIP自己的文件夹中,也找不到对应的.h文件。上网查阅后发现应该是缺少了对应的头文件的路径。 于是到可以编译的电脑上查看,发现确实存在不一样的地方这是可以正常编译... 查看详情
这个问题,c语言,一个关于头文件重复定义的问题!!!??
我在程序中建立一个globle.h文件,代码如下:#ifndef_GLOBLE_H#define_GLOBLE_Hinta;intb;intc;#endif1有多个.c以文件引用他,编译的时候说变量重复定义,我查资料说.h不能定义全局变量,可是我已经加入了#ifndef这样的语句(按理说它不会被重... 查看详情
tomcat运行后class文件不编译
...是,我在试了网上的很多方法后发现,我这里找不到class文件的原因是Tomcat运行时根本没有编译class文件,如图:(编译后的target)实际的出错原因:父模块中出现了子模块的内容。(出错时没有截图,后来试了好几次,发现没... 查看详情