c++ - VS2008 C++ : how can I make recursive include directories?

标签 c++ visual-studio-2008 include

我使用 Visual Studio 2008 在 C++ 中将一个复杂的项目作为库包含在内。

我有一组包含文件,它们分散在一个非常复杂的目录树结构中。树的根有大约十个目录,然后每个目录可以有多个子目录、子子目录等。

我知道该结构中的所有头文件都是必需的,而且它们无可救药地相互关联;我不能只包括一个目录,因为那样的话另一个目录中的依赖项会被遗漏并导致编译器因未被邀请参加聚会而崩溃。因此,每个人都必须包括在内。

我可以通过在项目中一次添加一个目录(右键单击->属性->附加包含目录)来做到这一点,但这可能充满痛苦,尤其是当其中一个依赖项有子项并创建一个全新的子目录。

有没有办法在头文件本身中指定一个包含目录,这样我就可以在需要使用它包含的函数时只包含该头文件?这样,我就可以更轻松地编辑包含文件,而且我不必确保调试版本和发布版本彼此一致(因为属性右键单击默认为当前版本,而不是所有版本,a从调试切换到发布时导致大量崩溃的功能)。更好的是,有没有办法指向根目录并强制递归包含所有内容?

编辑到目前为止所有这些回复:

不能编辑这个项目的结构。我只能链接到它。与其他人相比,我不喜欢代码的组织方式,但我必须在这种约束下工作。与其在容易出错的过程中花费数小时来查找所有相互依赖关系并将它们放入项目文件,不如以编程方式执行此操作?

最佳答案

这显然不是一个好主意,真的。

这些目录是按逻辑组组织代码的一种方式。

 /web
   /include
     /web
       /stackoverflow
         /language-agnostic
         /algorithm
         /database
       /meta
         /bug
         /feature-request
   /src

 /local/
   /include
     /local
       /my-favorites
   /src

现在如果我输入

#include "exception.h"

我到底想包括什么?那个文件在哪里?我怎样才能看到它的内容?

另一方面,如果我输入

#include "local/my-favorites/exception.h"

然后就很清楚了。 (我只有两个 include -Iweb/include -Ilocal/include)

这样,我可以拥有多个名称完全相同的文件,并且不会出现歧义,当您希望集成两个都具有此类“exception.h”的不同第 3 方库时,这非常好。

另请注意,为清楚起见,命名空间嵌套应反射(reflect)目录组织。这样

file: "web/include/web/meta/bug/exception.h"
namespace web { namespace meta { namespace bug {
  struct exception: std::runtime_error {};
} } } // namespace bug, namespace meta, namespace web

通过这种方式,很容易想到在需要一个类时必须包含什么标题。

另请注意,例如,如果您查看 boost,它们会在每个目录中为“懒惰”程序员放置 header ,其中包括所有子目录的 header

file: "web/include/web/meta/bug.h"
#include "web/meta/bug/file1.h"
#include "web/meta/bug/file2.h"
#include "web/meta/bug/file3.h"
#include "web/meta/bug/file4.h"
#include "web/meta/bug/file5.h"

file: "web/include/web/meta.h"
#include "web/meta/bug.h"
#include "web/meta/feature-request.h"

这些包含还可以使用 using 指令将名称“拉”到更通用的命名空间中:

namespace web { namespace meta {
  using ::web::meta::bug::bug;
} } // namespace meta, namespace web

减轻开发人员的痛苦。

正如您所看到的,该语言已经为您提供了一种非常好的方式来清晰地组织您的代码,如果您使用“全部包含”选项,您最终只会遇到无法维护的困惑:

#include "exception.h"
#include "bug.h"
#include "myString.h"
#include "database_connect.h"
#include "helper.h" // really love this one...
#include "file.h" // not bad either eh ?

我在工作中遇到过其中的一些......当你依赖 25 个以上的组件时,想想 20 个不合格的包含......现在,你认为有可能删除对组件 X 的依赖吗? ;)

编辑:如何处理第 3 方库?

有时第 3 方库不符合您的期望,无论是:

  • 不是自给自足的 header (即您需要包含 3 个文件才能使用 1 个对象)
  • 编译警告
  • 标题组织问题

您始终有机会将它们包装在您自己的 header 中。

例如,假设我有:

/include
  /file1.h
  /file2.h
  /detail
    /mustInclude.h
    /exception.h

任何时候你想包含一个文件,你必须在之前包含'exception.h'和'mustInclude.h',当然你会遇到很难发现包含的文件来自这个第三个的问题派对库,而不是您自己的(当前)项目。

好吧,只是包装:

/include
  /3rdParty
    /file1.h (same name as the one you would like to include, it's easier)

file: "/include/3rdParty/file1.h"

#pragma push
// ignore warnings caused
#include "detail/exception.h" // necessary to include it before anything
#include "file1.h"
#include "detail/mustInclude.h"
#pragma pop

然后在你的代码中:

#include "3rdParty/file1.h"

您刚刚隔离了问题,现在所有的困难都在您的包装文件中。

注意:我只是意识到您可能会遇到第 3 方 header 相互引用而不考虑“相对路径”的问题,在这种情况下,您仍然可以避免“多重包含”综合症(即使没有版本),但这可能是不幸的。

我想你没有机会不使用这样的垃圾 :x ?

关于c++ - VS2008 C++ : how can I make recursive include directories?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1590148/

相关文章:

c# - 将 C# 库转换为 MSTest 项目

ruby-on-rails - Ruby 扩展并包含跟踪代码

c++ - 在 makefile 中描述头文件位置

c - #include <string.h> -> 中止陷阱 : 6?

c++ - sprintf() 乱码输出

c++ - 如何在新 CPU 上利用 AVX2,同时支持旧 CPU?

c++ - std::vector push_back 在并行 for 循环中使用时失败

c++ - 使用 C_LOC() 将指向一维 Fortran 数组的指针传递给 C++ 会导致垃圾值

c# - 在 VS2008 中的 Windows x64 上调试 x86 .NET 应用程序

c++ - 如何将一个包含的头文件从一个项目包含到另一个项目? VS2008