其中一个流行的方式来组织项目目录或多或少是这样的:

MyLib
     +--mylib_class_a.h
        mylib_class_a.cpp
        mylib_library_private_helpers.h
        mylib_library_private_helpers.cpp

MyApp
     +--other_class.h
        other_class.cpp
        app.cpp

app.cpp

#include "other_class.h"
#include <mylib_class_a.h> // using library MyLib

有相同的库中的所有.h.cpp文件是在同一目录中。为了避免名称冲突,文件名前缀经常有公司名称和/或库名。 MyLib中会在MyApp的的头搜索路径,等等。我不是前缀名的粉丝,但我喜欢看#include的想法,并确切地知道该头文件属于。我不恨组织文件的这一做法,但我觉得应该有一个更好的办法。

自从我开始一个新的项目,我想征集一些目录组织的想法。目前我喜欢这个目录结构:

ProjA
    +--include
             +--ProjA
                    +--mylib
                           +--class_a.h
                    +--app
                           +--other_class.h
    +--src
         +--mylib
                +--class_a.cpp
                   library_private_helpers.h
                   library_private_helpers.cpp
         +--app
              +--other_class.cpp
                 app.cpp
                 util.h

app.cpp

#include "util.h" // private util.h file
#include <ProjA/app/other_class.h> // public header file
#include <ProjA/mylib/class_a.h> // using class_a.h of mylib
#include <other3rdptylib/class_a.h> // class_a.h of other3rdptylib, no name collision
#include <class_a.h> // not ProjA/mylib/class_a.h
#include <ProjA/mylib/library_private_helpers.h> // error can't find .h 

.cpp文件和私人(只为快速库可见).h文件存储在src目录下(SRC有时被称为LIB)。公用头文件被组织成一个项目/ lib目录结构,并通过<ProjectName/LibraryName/headerName.h>包括在内。文件名不与任何前缀。如果我需要打包MyLib中被其他球队可以使用,我可以简单地改变我的makefile复制相应的二进制文件和整个包括/ ProjA。目录

一旦文件被签入源代码控制,人们开始对他们的工作将难以改变目录结构。这是更好地得到它的权利在一开始走。

任何有经验的组织这样的源代码?任何你不喜欢呢?如果你有更好的方式来做到这一点,我非常想听到它。

有帮助吗?

解决方案

好了,这一切都取决于这些项目有多大。如果你只得到了几个文件,然后乱作一团他们都一个文件夹中。

当你没有得到很多文件管理文件夹太多在我看来矫枉过正。它让进出的文件夹时,你只在其中获得了一些文件恼人的挖掘。

此外,这取决于谁在使用这个东西。如果你正在写一个库,它要由其他程序使用,那么这是很好的组织,他们要使用到的包括文件夹中的头。如果您创建了一批图书馆和出版所有这些,那么你的结构可能会奏效。但是,如果他们是独立的库,开发是不是所有的一起做,他们得到版本,并在不同时间发布的,你会更好,有对一个项目一个文件夹可定位的所有文件坚持。

其实,我要说把一切都在一个文件夹,直到你得到你找到它的unmanagable一个点,然后重组为划分源成文件夹,像你这样做的一个聪明的方案。你可能会知道它需要如何从您遇到的问题进行组织。

KISS通常总是处于编程的溶液 - >保持一切尽可能简单

其他提示

为什么不这样做的第一个,仅使用MyLib驻留在作为包括指令的一部分,从而降低了傻前缀的目录:

#include <MyLib/ClassA.h>

这是告诉你他们来自哪里。至于第二个选择,我个人得到真正恼火,当我有一个头或源文件打开,并有通过目录结构中导航四处找其他并打开它。随着你的第二个例子,如果你有src/mylib/class_a.cpp开放,并希望修改标题,在许多编辑你必须回去两个级别,然后进入include/ProjA找到头之前。而我们如何知道头在ProjA子目录没有一些其他外部线索?另外,它是太容易了一个文件或其他获得移动到其他地方,“更好”代表如何使用它,没有备用文件被移动。这给了我头疼,当我遇到它在我的工作(我们也有我们的代码库,人们做了我刚才提到的每一个潜在的问题的某些部分)。

我曾尝试这两种方法。就个人而言,我喜欢的第一个更好的。我理解的冲动,把一切在更具体的目录,但它会导致大量的过度复杂的。

我通常使用这样的规则:应用程序和内部库使用第一种方法。公共开放源码库使用第二种方法。当你发布的代码,它帮助了很多,如果包括文件在一个单独的目录。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top