编译器说,它无法找到文件,但报告错误" unfound"文件?

时间:2017-08-18 18:14:28

标签: c++ compiler-errors compilation include

我有两个短文件位于同一目录中。每个内容如下所示。

  • 档案test.cpp包含:

    int main()
    {
        #include <test.h>
    }
    
  • 档案test.h包含:

    syntax_error
    

在使用test.cppg++编译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;文件?

1 个答案:

答案 0 :(得分:3)

这是一个功能,而不是错误。

这个想法是,如果错误是微不足道的(如缺少分号),那么编译器将尝试继续编译,就像您已经修复了错误一样。这使您可以一次修复多个错误。在编译代码需要很长时间时,这尤其有用。

想象一下修复丢失的分号,重新编译五个小时,只是为了让编译器找到另一个缺少的分号。然后你必须重新编译。那会非常令人沮丧,不是吗?

基本上,编译器会尽可能地从任何错误中恢复,以便能够尽可能多地报告错误。大多数编译器都有这样的标志。

  

但是,为什么编译器说它在找到文件时找不到文件呢?

编译器发现文件是,这就是为什么它提示您使用""代替<>的原因。如果它没有,它可能没有给你提示。但是,编译器不允许正确编译代码,因为您的代码格式不正确。

作为类比,仅仅因为编译器发现缺少分号,这并不意味着它只能编译具有该缺失字符的代码(如果它试图符合标准)。然而,如果有的话,它会恢复并尝试查找其他错误。