【问题标题】:Compiler says it cannot find file and yet reports errors in "unfound" file?编译器说它找不到文件但在“未找到”文件中报告错误?
【发布时间】:2017-08-18 18:14:27
【问题描述】:

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

  • 文件test.cpp 包含:

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

    syntax_error
    

在使用g++clang++ 编译test.cpp 时,出现预期错误。

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 中使用引号。但是,为什么编译器在明确找到文件时却说找不到文件?还有,为什么会继续报“未找到”文件的错误?

【问题讨论】:

  • 第一条信息很简单:它说,“我找到了,但是在错误的地方。用引号,卢克。”看起来你不小心使用了&lt;&gt;
  • 感谢您的链接,尽管我熟悉 include &lt;filename#include "filename" 之间的区别。尽管如此,编译器在这种情况下处理这种情况的方式似乎很奇怪。
  • 不好奇。 &lt;&gt; 具有实现定义的行为。这个特定的实现也会在本地文件夹中查找,并且非常友好地告诉您您的程序不兼容、原因以及如何修复它,然后继续查找更多错误。
  • 如果您仔细阅读,该消息并没有说找不到该文件,而是说在&lt;&gt; 搜索路径之一中找不到该文件。如果根本找不到,您会收到另一条消息。

标签: c++ compiler-errors compilation include


【解决方案1】:

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

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

想象一下修复丢失的分号,重新编译五个小时,以便编译器找到另一个丢失的分号。然后你必须再次重新编译。那会很令人沮丧,不是吗?

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

但是,为什么编译器在明确找到文件时却说找不到文件?

编译器发现文件是的,这就是为什么它提示您使用"" 而不是&lt;&gt;。如果没有,它可能不会给你提示。尽管如此,还是不​​允许编译器正确编译您的代码,因为您的代码格式不正确。

作为一个类比,仅仅因为编译器发现了一个丢失的分号,这并不意味着它可以编译带有那个丢失字符的代码(如果它试图符合标准)。但它会恢复并尝试查找其他错误(如果有)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多