我有两个短文件位于同一目录中。每个内容如下所示。
档案test.cpp
包含:
int main()
{
#include <test.h>
}
档案test.h
包含:
syntax_error
在使用test.cpp
或g++
编译clang++
后,我收到了预期的错误。
test.cpp:3:11: error: 'test.h' file not found with <angled> include; use
"quotes" instead
#include <test.h>
^~~~~~~~
"test.h"
但是,我还得到第二个错误,似乎与第一个错误相矛盾。
In file included from test.cpp:3:
./test.h:1:1: error: use of undeclared identifier 'syntax_error'
syntax_error
^
基本上,第一个错误报告编译器无法找到文件test.h
,第二个错误报告编译器报告无法找到的文件中的语法错误。
这是产生的唯一两个错误。
我理解为什么编译器会报告第一个错误,并且在这种情况下我应该使用带#include
的引号。但是,为什么编译器说它在找到文件时找不到文件呢?并且,为什么它会继续报告错误&#34; notound&#34;文件?
答案 0 :(得分:3)
这是一个功能,而不是错误。
这个想法是,如果错误是微不足道的(如缺少分号),那么编译器将尝试继续编译,就像您已经修复了错误一样。这使您可以一次修复多个错误。在编译代码需要很长时间时,这尤其有用。
想象一下修复丢失的分号,重新编译五个小时,只是为了让编译器找到另一个缺少的分号。然后你必须重新编译。那会非常令人沮丧,不是吗?
基本上,编译器会尽可能地从任何错误中恢复,以便能够尽可能多地报告错误。大多数编译器都有这样的标志。
但是,为什么编译器说它在找到文件时找不到文件呢?
编译器发现文件是,这就是为什么它提示您使用""
代替<>
的原因。如果它没有,它可能没有给你提示。但是,编译器不允许正确编译代码,因为您的代码格式不正确。
作为类比,仅仅因为编译器发现缺少分号,这并不意味着它只能编译具有该缺失字符的代码(如果它试图符合标准)。然而,如果有的话,它会恢复并尝试查找其他错误。