【问题标题】:C include file from multiple locationsC包含来自多个位置的文件
【发布时间】:2015-03-09 14:35:27
【问题描述】:

我正在使用 IAR 开展一个项目。 在项目中,有多个位置可以搜索包含文件。 有两个位置都具有相同的名称文件。 所以,在 C 文件中,我们有 #include "some_file.h" 编译器/预处理器如何处理这个?它是否包括它找到的第一个some_file.h

我的猜测...它按照在 IAR 项目定义中定义的顺序在目录中进行搜索。然后它在第一场比赛中停止。这是正确的吗?

【问题讨论】:

  • 它正在以特定的顺序搜索文件。为了验证只需在这些位置创建两个具有相同名称的文件,并在其中放置一些不同的#warning 行。

标签: c include


【解决方案1】:

通常在使用#include "foo.h" 时,首先搜索相对于当前源文件的文件,而#include <foo.h> 将首选标准路径。

GCC documentation:

GCC 首先在包含当前文件的目录中查找使用 #include "file" 请求的头文件,然后在由 -iquote 选项指定的目录中,然后在相同的位置查找使用尖括号请求的头文件.例如,如果 /usr/include/sys/stat.h 包含#include "types.h",则 GCC 首先在 /usr/include/sys 中查找 types.h,然后在其通常的搜索路径中查找。

补充: 通常自定义路径也会按照它们在命令行中出现的顺序进行搜索。 因此对于-I/opt/include -I$dependency/include#include "foo.h",将搜索以下路径:

  1. ./foo.h(与包含文件的目录相同)
  2. /opt/include/foo.h(第一个自定义路径)
  3. $dependency/include/foo.h(第二个自定义路径...)
  4. /usr/include/foo.h(标准搜索路径)

您还可以通过查看gcc -E foo.c 的输出来找出准确包含哪些文件。

请参阅 here 了解 -I-iquote 的工作原理。

【讨论】:

    【解决方案2】:

    据我所知,它确实按照定义的顺序进行搜索。

    您可以通过在两个标题之一中更改或添加一些值来测试它,以查看包含哪一个或简单地重命名一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2020-10-18
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多