如何避免在C或C ++ #include指令中明确声明目录路径?

我正在制作模拟器并编写了大量文件和标题。 问题是每当我包含一个文件时,我都会给出特定文件的相对路径。 例如,我的应用程序中的典型代码就像是一样

#ifndef AI_H #define AI_H #include  #include "../world/world.h" #include "pathPlan.h" #include "skills/tryskill.h" #include "../info/condition.h" #include "dataStructures/destination.h" #include "../params/gamePlay.h" #include "../modules/controlModule.h" class ai { public: etc etc 

我想避免使用相对路径。 例如,我想直接包含“tryskill.h”和“destination.h”而不给出绝对路径。 这样,如果我改变任何特定文件的位置,我不需要打扰。 我正在使用Ubuntu 9.10。 任何帮助将受到高度赞赏。

真的,这一切都取决于你的包含路径,不同的编译器可能会称之为不同的东西,但在gcc中

 -Idir Append directory dir to the list of directories searched for include files. 

因此,在您的示例中,您将在-I中的目录列表中指定../world etc...

通常,如果您从命令行进行编译,则会向编译器提供包含搜索路径(gcc示例: http : //gcc.gnu.org/onlinedocs/cpp/Search-Path.html )。 如果您使用的是IDE,则应该能够为IDE指定包含搜索路径,IDE将把这些路径传递给您的编译器。

编译器将允许您在命令行(或响应/配置文件)上指定搜索头文件的目录。 如果您使用其中一种工具驱动构建,通常可以在makefile或IDE的项目设置中进行配置。

但是,一般来说,我更喜欢指定“属于”项目的标题的相对路径(而不是可能跨项目使用的库)。 这样,当您添加新模块时,您不必使用项目设置或制作文件来继续构建。

如果您希望将模块的标头与模块的实现保持在一起,而不是将标头堆积到单个(或一小组)目录中。 任何一个组织都可以说是另一个组织。

您应该使用与程序/库的顶级包含路径相关的路径。 有很多不同的方法可以做到这一点,具体取决于您构建程序的方式。 如果您正在使用CMake构建系统 – 我强烈建议您使用它 – 那么您将使用INCLUDE_DIRECTORIES命令:

 INCLUDE_DIRECTORIES(包括)

如果您的“info / condition.h”文件位于“include / blah / info / condition.h”中,那么您可以将其包含在:

 #include 

如果使用g ++从命令行进行编译,则可以使用-I命令行开关:

 g ++ file1.cpp file2.cpp ... fileN.cpp -I./include

如果您正在使用Make,则可以通过添加以下行来确保使用此标志:

 CPPFLAGS + = -I./include

另一种可能性,虽然我不建议,是定义环境变量CPATH

 #注意以下是您在BASH中的操作:
 export CPATH =“$ CPATH”:“`pwd` / include”

思考的食物:替代品是什么?

 #include "pathPlan.h" #include "exception.h" #include "world.h" #include "exception.h" // uh ? 

我总是担心在include paths变量中声明的路径太多,问题是路径越多,你就越有可能得到文件名冲突,而且调试真的很烦人。

我更喜欢这个:

 // 3rd party libraries #include <3rdParty1/foo.h> #include <3rdParty2/foo.h> // Projects I depend on #include "myProject1/bar.h" // Current project, from the include directory #include "currentProject/foobar.h" #include "currentProject/another.h" // Current project, from the source directory (private includes) #include "../world.h" #include "../detail/helper.h" 

对于给定项目“thingy”,这意味着我有以下文件:

 // in thingy/1-3-0-2/include/thingy/foo.h namespace thingy // base namespace is project name // namespace hierarchy identical to folders hierarchy { } 

然后我在编译行上有以下内容:

 -I${Repository}/thingy/1-3-0-2/include 

当然这是一个更多的打字,但它有助于保持一切整洁:

  • 命名空间/文件夹关联使得更容易找到文件的位置
  • 项目前缀使得来自不同项目的2个文件即使具有相同的名称也不可能混淆

任何好的IDE或makefile都允许您列出文件的相对搜索路径。 请查看此解决方案。