2016-05-23 70 views
0

我不知道我做错了什么,但是突然间我的C++项目在该项目的某个部分中为每一行头文件抛出错误。其中一个文件中肯定有问题,但我应该如何找出这100个错误中的哪一个是相关的?我可以做些什么关于“错过X之前”级联错误?

登录样子:

5>d:\ ... PROJECT_HOME ... \services\src\services\database\techcore\processes\inputdialog\../import/ImportDataSource.h(10): error C2143: syntax error : missing ',' before ')' 
5>d:\ ... PROJECT_HOME ... \services\src\services\database\techcore\processes\inputdialog\../import/ImportDataSource.h(16): error C3861: 'mapping_': identifier not found 
5>d:\ ... PROJECT_HOME ... \services\src\services\database\techcore\processes\inputdialog\../import/ImportDataSource.h(17): error C2143: syntax error : missing ',' before '{' 
5>d:\ ... PROJECT_HOME ... \services\src\services\database\techcore\processes\inputdialog\../import/ImportDataSource.h(17): error C2143: syntax error : missing ';' before '{' 
5>c:\qt\5.3.0-64\qtbase\include\qtwidgets\../../src/widgets/kernel/qaction.h(162): error C2143: syntax error : missing ';' before '{' 
5>c:\qt\5.3.0-64\qtbase\include\qtwidgets\../../src/widgets/kernel/qaction.h(162): error C2065: 'Hover' : undeclared identifier 
5>d:\ ... PROJECT_HOME ... \services\src\services\database\techcore\processes\inputdialog\../import/ImportDataSource.h(30): error C2143: syntax error : missing ';' before '{' 
5>c:\qt\5.3.0-64\qtbase\include\qtwidgets\../../src/widgets/kernel/qaction.h(177): error C2065: 'QGraphicsWidget' : undeclared identifier 

我故意复制部分地方错误也来自外部库。编译器简直疯了。我该如何解决这个问题?我如何找到导致这种级联错误的地方?是否有一些验证程序可以处理文件并提供一些提示?我手动浏览了大部分文件,他们似乎是正确的。

这不是第一次发生在我身上,所以我决定现在是时候询问如何解决这些问题了。

+5

你应该看看第一个错误。所有其他人都是不相关的(除非你能确切地知道他们来自哪里)。查看第一条错误消息中提到的行的代码。 –

+0

制作[mcve]通常会有所帮助 – NathanOliver

+1

启用致命错误(GCC上的'-Wfatal-errors',在MSVC上可能具有相同的效果)会阻止编译进行并编译更多文件,从而减少输出量。然后找到第一个报告的错误并向后搜索(也可以下载到'#include'd文件中)。错字通常离那里不远。 – Quentin

回答

3

通常,“编译器疯了”是编译器遇到大量错误的一个症状,在受影响的源文件(又名编译单元)中仍然有更多的代码需要处理。

当遇到问题时,大多数编译器都会发出诊断信息,但会继续处理源文件直到它们到达文件末尾。在编译器发出几个诊断信息后,经常会出现一个问题,即它处于一种奇怪的状态,因此后续诊断与正在处理的代码几乎没有关系。

解决这个问题的方法很简单 - 查找并更正编译器问题的第一个诊断,而不是最后一个。如果错误消息与多个头文件相关联,则无关紧要 - 在预处理之后,编译器会按顺序处理代码,因此它报告的第一个错误消息是第一个找到的错误消息。

许多开发人员(不仅仅是初学者)从大屏幕诊断(或者,例如,可滚动窗口)的底部开始,然后处理屏幕。这有效地从编译器发布的最后一个诊断开始,而不是第一个 - 编译器最可能被混淆的点,并发出与代码几乎没有关系的诊断。相反,有必要向上滚动屏幕,找到第一个诊断信息,并首先解决问题。

某些编译器支持在指定次数的错误后停止编译的选项。这些选项可以用来限制报告错误的数量,因此可以减少错误消息的可能性。然而,这通常只是部分有效的,因为对引发编译器混淆的错误数量没有硬性规定。正如我上面所说的,真正的解决方案是养成寻找第一个错误信息并解决这个问题的习惯,而不是试图从最后的错误信息中反向工作。