“ #include <path / to / header>”指令的含义(例如“ #include <loki / Functor.h>”)

时间:2019-08-14 20:12:58

标签: c++

我正在尝试使用Loki library中的代码(主要是头文件)来测试其功能。具有#include <loki/Typelist.h>指令的行出现错误。我从未见过<>之类的路径。 (我知道常规的#include <strings>等指令,它会搜索预定义的路径)

<path/to/header>形式的include伪指令如何工作?

我是否正确地假设该库会将自身插入到编译器搜索的标准路径之一中?如果是这样,则无需将库插入所述路径即可使用它的任何方式。 (我只想测试包含这些标头的函数)

编辑:

Test.cpp

#include "Functor.h"
#include <iostream>

using namespace std;

struct TestFunctor
{
    void operator()(int i, double d)
    {
        cout << " TestFunctor called.\n";
    }
};

int main()
{
    TestFunctor f;
    Functor<void, TYPELIST_2(int, double)> cmd(f);
    cmd(4, 4.5);
}

注意:Test.cpp文件位于loki-lib / include / loki

错误:

$ gcc Test.cpp
In file included from Test.cpp:1:0:
Functor.h:34:10: fatal error: loki/Typelist.h: No such file or directory
 #include <loki/Typelist.h>
          ^~~~~~~~~~~~~~~~~
compilation terminated.

2 个答案:

答案 0 :(得分:1)

  

#include <path/to/header>”指令的含义(例如“ #include <loki/Functor.h>”)

c ++标准(最新草案)说:

  

形式的预处理指令

# include < h-char-sequence > new-line
     

在实现定义的位置序列中搜索由<和>分隔符之间的指定序列唯一标识的标头,并用该标头的整个内容替换该指令。   如何指定位置或标识标题是实现定义的。


实施定义的行为取决于您使用的语言的实现。 GCC编译器的示例文档:

#include <file>
     

此变体用于系统头文件。它在系统目录的标准列表中搜索名为file的文件。您可以使用-I选项将目录添加到此列表的前面(请参阅调用)。

根据Filesystem Hierarchy Standard,例如,在Linux系统上,标准位置应为/usr/include

GCC编译器的

-v选项应显示编译器使用的系统包含目录的确切列表。


  

我是否正确地假设该库会将自身插入到编译器搜索的标准路径之一中?

编译器会搜索标准目录,是的。如果标题不在搜索的目录中,则将找不到它们。

  

如果是这样,则无需将库插入所述路径即可使用它的任何方式。

根据引用的文档,如果使用GCC,则可以使用-I(大写i)选项添加非标准包含位置。

答案 1 :(得分:1)

尽管它在技术上是实现定义的,但实际上,大多数系统(Windows和Linux)使用斜杠(正向或反向)来指定路径(目录),正如我确定的那样。我相信包括GCC在内的某些编译器会自动将#include指令中指定的路径转换为运行它们的系统的正确目录分隔符。您列出的特定示例中的路径loki/Typelist.h是相对路径。因此,编译器将从其#include文件搜索路径中的所有目录开始,查找其相对路径(从这些目录中的任何一个开始)与loki/Typelist.h相匹配的文件。

顺便说一句,您可以通过在编译器命令行中添加-I选项来将路径添加到#include搜索路径中;例如-IC:\OpenSSL-Win32\include。如果使用Makefile,则可以通过将其附加到COPTS(或类似变量)之后来添加它们。