【问题标题】:#include Header Files When They Are In a Different Directory Structure#include 位于不同目录结构中的头文件
【发布时间】:2012-05-28 09:17:48
【问题描述】:

我已经进行了一些搜索,并在 C++ 中包含头文件的正确方法上找到了类似的线程,但他们都没有完全回答这个问题。

我知道要将头文件包含在另一个文件夹中,您可以简单地使用以下语法:

#include "../myFolder/myFile.h"

但是当文件位于不同的目录结构中时会发生什么? 例如,如果以下内容保证为真:

当前目录=/f1/f2/f3/f4/f5/myFile.cpp

所需的头目录=/f1/d2/d3/d4/d5/d6/myHeader.h

我知道您可以设置“附加包含目录”属性或使用 make 文件,但我想知道是否有办法从 #include 语句中做到这一点。

【问题讨论】:

  • 您显然可以将整个相对或绝对路径放在您的 include 语句中(我不建议这样做),但我怀疑您正在寻找更紧凑的东西?
  • 感谢您的评论!我正在寻找是否有办法做到这一点并且仍然让它是相对的,因此目录结构中 f1 (在此示例中)之上的内容无关紧要。
  • 嗯,你可以把“..”串在一起,例如#include ../../../../../../f2/f3/f4/f5/myFile.cpp 太丑了,我马上就后悔打字了。我建议在 makefile 中设置包含路径。
  • 为什么人们这么快就忽略了显而易见的解决方案? “其他包含目录”可用是有原因的 - 使用它。

标签: c++ directory header-files


【解决方案1】:

要完成@shoosh 的答案,您应该告诉编译器那些“其他”头文件在哪里。在 windows 上使用 gcc,如果它们在 c:\path\to\library 中,则添加 -I 选项

-Ic:\path\to\library

注意路径中的空格,如果位置是c:\my path\to\library,那么:

-I"c:\my path\to\library"

其他编译器将在命令行或通过 IDE 提供类似的选项。

【讨论】:

    【解决方案2】:

    ".." 放入#include 通常被认为是丑陋且不可维护的。

    您使用的每个连贯库(例如 boost)都有一个头文件层次结构的根,您应该将其放入“附加包含目录”属性中。对于提升,它类似于

    `C:/lib/boost_1_49`
    

    在此目录下,您通常会找到一个名为boost 的目录,所有标题都在其中。这带来了所有 boost headers 开头的约定:

    #include <boost/bla/bla.hpp>
    

    这也适用于您正在编写的项目。您应该确定其标头的最佳根是什么,并从那里开始所有包含。
    此规则的唯一例外应该是位于同一目录中的标头。这些可以仅作为文件名包含#include "same-dir-header.h"

    您还应该区分包含""&lt;&gt;。引号应该是你项目中的东西,尖括号应该是外部库(或者有些人会这样 - OS 和 C 运行时库)

    【讨论】:

    • 这里的窍门是保证目录结构相对相同,但整个东西在机器上的位置却不是。听起来越来越像需要一个 make 文件,但我只是想知道它是否可能。
    • 它也是真正不可移植的。我们曾经尝试编写代码来使用两个编译器:一个评估相对于 .h 文件中相对于 .h 文件位置的包含,另一个评估相对于 .c 文件的相同包含。包含路径是要走的路。基本问题是include指令中../的含义是实现定义的。
    猜你喜欢
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多