如何包含不带引号的头文件?

Posted

技术标签:

【中文标题】如何包含不带引号的头文件?【英文标题】:How to include header files without quotation marks? 【发布时间】:2018-10-17 23:37:53 【问题描述】:

我对编程有点陌生,所以请放轻松。无论如何,我知道包含您自己定义的头文件。例如:

#include "yourHeader.h"

我正在尝试将 FLTK 用于它的 GUI 选项,但是,它的许多头文件都包含其他头文件,使用这样的包含:

#include <FL/Blah.h>

而不是这个:

#include "FL/Blah.h"

我必须检查每个包含在尖括号中的头文件并将它们更改为引号以便它们工作。我目前正在 CodeBlocks 工作,如果这很重要的话。有什么方法可以使用尖括号而不是引号来包含头文件,还是我不得不自己进入头文件并手动将它们全部换掉?

【问题讨论】:

"" 告诉预处理器在项目文件夹中查找文件,&lt;&gt; 告诉它在编译器的包含文件夹中查找它。没有&lt;"&gt; "我必须检查每个包含在尖括号中的头文件并将它们更改为引号以便它们工作" - 不,你没有。您只需确保 FLTK 库位于编译器的包含搜索路径中。 【参考方案1】:

一般来说,头文件来自

#include "headerfile"

将在当前源路径中搜索。如果搜索失败,则重新处理,好像

#include <header file>

会。

您的 FLTK 库正在使用如下的包含?

#include <FL/Blah.h>

FL 的父路径应该在预定义的 INCLUDE 路径中。您可以编辑您的 Makefile 或项目设置。

【讨论】:

【参考方案2】:

您可以在编译时将包含所有标题的文件夹添加到包含路径中。 How to add a default include path for GCC in Linux?

【讨论】:

【参考方案3】:

一些背景

好的,有两组包含搜索路径。

用户包含路径: 这通常只是当前目录(也称为“.”)。 注意:可能是其他人,但为简单起见,我们只使用“。”在下面的例子中。

然后是系统包含路径: 这通常是您机器中的几个位置(可能是 /usr/include/usr/local/include)。 注意:可能是其他的,但为简单起见,我们在下面的示例中假设这些。

它通常是如何工作的。

有一些注意事项,并非所有编译器的工作方式都完全相同。但以下是一个很好的经验法则。

当您使用引号 "" 包含文件时。

#include "yourHeader.h"

它将在“用户包含路径”中指定的所有目录中搜索此文件。如果在那里找不到它们,它将在“系统包含路径”指定的所有目录中查找。所以你的编译器会搜索以下文件:

./yourHeader.h
/usr/include/yourHeader.h
/usr/local/include/yourHeader.h

它将使用它找到的第一个。

当您在包含中使用&lt;&gt; 时:

#include <FL/Blah.h>

它将首先搜索“系统包含路径”中的文件。然后根据您的编译器可以选择搜索“用户包含路径”(但现在假设不是)。

所以在这种情况下它会搜索文件:

/usr/include/FL/Blah.h
/usr/local/include/FL/Blah.h

它将使用它找到的第一个。

修改默认值

所以这些是搜索文件的默认路径。但是您的编译器将允许您(通常)向这两个搜索路径添加额外的路径。这取决于您的编译器如何添加搜索路径。

对于 gcc(可能还有 clang),它使用 -I-isystem(可能更多)

期望。

当您在包含标头中看到&lt;&gt; 时,通常意味着这是您正在寻找的已安装库。因此,您的代码假定您的机器上已经安装了 FLTK 库。

当您在包含标头中看到"" 时,您应该假定它是属于该项目的本地文件。

【讨论】:

以上是关于如何包含不带引号的头文件?的主要内容,如果未能解决你的问题,请参考以下文章

GCC的头文件搜索路径

QT中头文件带不带.h的问题

C语言头文件路径剖析

include包含头文件的语句中,双引号和尖括号的区别

包含不必要的头文件如何影响我的可执行文件

单片机c语言中常用的头文件有哪些?分别有啥作用啊?