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



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

表单<path/to/header>的包含指令如何工作?

我假设库将自身插入编译器搜索的标准路径之一是否正确?如果是这样,可以在不将库插入所述路径的情况下使用它的任何方法。(我只想测试一个包含这些标头的函数(

编辑:

测试.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.

"#include <path/to/header>"指令的含义(如"#include <loki/Functor.h>"(

C ++标准(最新草案(说:

表单的预处理指令

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

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

实现

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

#include <file>

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

例如,根据文件系统层次结构标准,应在 Linux 系统上/usr/include标准位置。

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


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

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

如果是这样,可以在不将库插入所述路径的情况下使用它的任何方法。

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

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

顺便说一句,您可以通过向编译器命令行添加-I选项来向 #include 搜索路径添加路径; 例如-IC:OpenSSL-Win32include.如果使用生成文件,则可以通过追加到COPTS(或类似(变量来添加这些内容。

最新更新