C++ 是否有可能强制编译器使用“的名称”;“工作”;从包含中构造所有全名的目录?

C++ 是否有可能强制编译器使用“的名称”;“工作”;从包含中构造所有全名的目录?,c++,path,include,environment-variables,C++,Path,Include,Environment Variables,让我们假设在first.h中有#包括“aaa/second.h”,在aaa/second.h中有#包括“bbb/third.h”。我认为在“默认设置”中,如果“third.h”不在“aaa/bbb”中,编译器会抱怨 是否可以通过使用first.cpp所在的目录来构造所有include中的全名来更改此行为 例如,如果“first.h”位于“/home/bucky/”中,那么#包括“bbb/third.h”(来自“aaa/second.h”)应解释为/home/bucky/bbb/third.h,而

让我们假设在
first.h
中有
#包括“aaa/second.h”
,在
aaa/second.h
中有
#包括“bbb/third.h”
。我认为在“默认设置”中,如果“third.h”不在“aaa/bbb”中,编译器会抱怨

是否可以通过使用
first.cpp
所在的目录来构造所有include中的全名来更改此行为

例如,如果“first.h”位于“/home/bucky/”中,那么
#包括“bbb/third.h”
(来自“aaa/second.h”)应解释为
/home/bucky/bbb/third.h
,而不是
/home/bucky/aaa/bbb/third.h

编辑

我无法更改整个源代码。在代码中,使用引号代替尖括号

我在命令行中使用
g++-std=c++0x name.cpp-o name
进行编译。我在两个不同的终端上做。在第一个终端中,工作目录用于构造全名,而在第二个终端中,情况并非如此。我几乎可以肯定,这是因为环境变量,但我不知道是哪一个。所以,我的问题是,在更大程度上,哪些环境变量可以迫使编译器使用工作目录构造全名

编辑2

在test.cpp文件中,我包括“first.h”。此包含内容不会导致任何问题(编译器查看“first.h”)。“first.h”文件包括“ppp/second.h”。它也不会引起任何问题。但是“ppp/second.h”包括“ppp/third.h”,这就是问题出现的地方。我认为问题的原因是“second.h”试图在second.h所在目录的“ppp”子目录中查找“third.h”。换句话说,second.h尝试在“ppp/ppp”子目录中查找第三个.h(因为second.h位于ppp子目录中)


在另一个终端中,相同目录中的相同编译命令不会导致任何问题。原因显然在于环境变量的值。

您应该为项目全局设置包含路径。在您的示例中,您将向编译器传递一些选项,如
-I/home/bucky
(如果是GCC或Clang)。MSVC也有类似的选择


(所有#include都是相对于include路径进行搜索的。
“…”
之间的区别在于后者也搜索当前目录。)

您应该为项目全局设置include路径。在您的示例中,您将向编译器传递一些选项,如
-I/home/bucky
(如果是GCC或Clang)。MSVC也有类似的选择


(所有#include都是相对于include路径进行搜索的。
“…”
之间的区别在于后者也搜索当前目录。)

是。确切的机制取决于编译器,但短的和长的是,您需要配置编译器以将项目路径包含在搜索路径中。对于通过
-I
命令行标志(
-I path/of/first.cpp
)完成的GCC和clang。此配置通常在项目设置(如果您使用IDE)、Makefile或类似文件中完成


因为您正在讨论环境变量:传递给
g++
c++
编译器的标志由
cxflags
CFLAGS
变量控制。

是。确切的机制取决于编译器,但短的和长的是,您需要配置编译器以将项目路径包含在搜索路径中。对于通过
-I
命令行标志(
-I path/of/first.cpp
)完成的GCC和clang。此配置通常在项目设置(如果您使用IDE)、Makefile或类似文件中完成


因为您正在谈论环境变量:传递给
g++
c++
编译器的标志由
cxflags
CFLAGS
变量控制。

您的第二个
中缺少引号或尖括号,包括
@Kerrek SB,谢谢。我需要引号。你的第二个
#include
@Kerrek SB缺少引号或尖括号,谢谢。我需要引号。我认为引号应该用于你自己的标题
aaa/second.h
,可以在
/home/bucky/aaa/second.h
-I/home/bucky
中找到。尖括号仅用于
/usr/include/time.h
中的系统标题
time.h
。实际上,大多数编译器不区分和@Dan不,编译器确实区分它们。不同之处在于Kerrek所写的内容,但只要不使用相对于本地目录的includes,就可以(在我的书中,应该)使用尖括号。这就是这里发生的情况:您使用的是相对于(配置的)搜索路径的includes。尖括号在这里是正确的。它们绝对不限于系统标题。@Konrad Rudolph,我对最初的问题做了两次编辑,以澄清我的问题到底是什么。简而言之,我认为编译器的行为可以在不使用-I选项的情况下更改,也不需要将“替换为”。@Roman请参阅前面的注释和Kerrek的答案–您不需要将
“…”
更改为
。为什么您认为这可以在没有
-I
的情况下实现?你为什么要这样做?你似乎想解决错误的问题。@DanS啊,我收回这句话。§16.2/7建议(但不强制要求)将
用于“随实施提供的标题”