mmr*_*mmr 1 c++ include visual-studio-2008
我使用Visual Studio 2008将一个复杂的项目作为C++库包含在内.
我有一组包含在非常复杂的目录树结构中的包含文件.树的根有大约十个目录,然后每个目录可以有多个子目录,子目录等.
我知道该结构中的所有头文件都是必要的,并且它们无可救药地相互关联; 我不能只包含一个目录,因为那时另一个目录中的依赖关系会被遗漏,并导致编译器因未被邀请参加聚会而烦恼.所以,每个人都必须被包括在内.
我可以通过一次一个地添加目录到项目(右键单击 - >属性 - >其他包含目录)来实现这一点,但这可能充满痛苦,特别是当其中一个依赖项有子项并创建一个全新的子子目录时.
有没有办法在头文件本身中指定一个包含目录,这样我只要在需要使用它包含的函数时就可以包含该头文件?这样,我可以更轻松地编辑包含文件,而且我不必确保调试版本和发布版本彼此一致(因为属性右键单击默认为当前版本,而不是所有版本,从调试切换到发布时导致严重崩溃的功能).更好的是,有没有办法指向目录root并强制所有内容以递归方式包含?
编辑所有这些答复到目前为止:
我无法编辑这个项目的结构.我只能链接到它.我不喜欢代码的组织方式,而不是其他人似乎,但我必须在这个约束下工作.不是花费时间在容易出错的过程中找到所有相互依赖关系并将它们放在项目文件中,有没有办法以编程方式执行此操作?
这显然不是一个好主意,真的.
这些目录是一种在逻辑组中组织代码的方法.
/web
/include
/web
/stackoverflow
/language-agnostic
/algorithm
/database
/meta
/bug
/feature-request
/src
/local/
/include
/local
/my-favorites
/src
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入
#include "exception.h"
Run Code Online (Sandbox Code Playgroud)
我试图包括什么?那个文件在哪里?我怎样才能看到它的内容?
另一方面,如果我输入
#include "local/my-favorites/exception.h"
Run Code Online (Sandbox Code Playgroud)
然后它非常清楚.(我只有两个包含-Iweb/include -Ilocal/include)
这样,我可以拥有多个具有完全相同名称的文件,并且没有歧义,当您希望集成两个具有这种"exception.h"的不同第三方库时,这些文件很漂亮.
另请注意,为清楚起见,命名空间嵌套应反映目录组织.以便
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
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以轻松地想到在需要课程时必须包含哪些标题.
还要注意,例如,如果你看看boost,他们会在每个目录中为"懒惰"程序员添加标题,其中包括所有子目录的标题
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"
Run Code Online (Sandbox Code Playgroud)
这些包括也可能使用using指令将名称"拉"到更通用的命名空间中:
namespace web { namespace meta {
using ::web::meta::bug::bug;
} } // namespace meta, namespace web
Run Code Online (Sandbox Code Playgroud)
为了减少开发人员的痛苦.
正如您所看到的,该语言已经为您提供了一种非常好的方式来干净地组织您的代码,如果您使用"所有包含"选项,您将最终得到一个难以维护的混乱:
#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 ?
Run Code Online (Sandbox Code Playgroud)
我已经有一些在工作了......想想20个不合格的包括当你依赖25个以上的组件时...现在,你认为可以删除对组件X的依赖吗?;)
编辑:如何处理第三方库?
有时第三方图书馆不符合您的期望,无论是:
你总是有机会将它们包装在你自己的标题中.
例如,说我有:
/include
/file1.h
/file2.h
/detail
/mustInclude.h
/exception.h
Run Code Online (Sandbox Code Playgroud)
当你想要包含一个文件时,你必须包含'exception.h'BEFORE和'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
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中:
#include "3rdParty/file1.h"
Run Code Online (Sandbox Code Playgroud)
你刚刚解决了这个问题,现在所有的困难都在你的包装文件中.
注意:我只是意识到你可能会遇到第三方标题引用彼此而不考虑"相对路径"的问题,在这种情况下,你仍然可以避免"多重包含"综合症(即使没有版本),但是这可能是命运多..
我想你没有机会不使用这样的垃圾:x?