C++项目源代码布局

Shi*_*Yip 8 c++ version-control directory-structure code-organization project-organization

组织项目目录的一种流行方式或多或少是这样的:

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
Run Code Online (Sandbox Code Playgroud)

同一个库的所有.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 
Run Code Online (Sandbox Code Playgroud)

.cpp文件和私有(仅对直接库可见).h文件存储在src目录下(src有时称为lib).公共头文件被组织成一个项目/ lib目录结构并包含在内<ProjectName/LibraryName/headerName.h>.文件名不带任何前缀.如果我需要将MyLib打包以供其他团队使用,我可以简单地更改我的makefile以复制相应的二进制文件和整个include/ProjA目录.

一旦将文件检入源代码控制并且人们开始处理它们,将很难更改目录结构.最好在开始时把它弄好.

有经验组织这样的源代码的人吗?你不喜欢什么吗?如果你有更好的方法,我非常想听听它.

Sco*_*ham 8

嗯,这完全取决于这些项目有多大.如果您只有几个文件,那么将它们全部打包在一个文件夹中.

当你没有很多文件需要管理时,太多的文件夹在我看来有点过分.当你只有几个文件时,它会很烦人地进出文件夹.

此外,这取决于谁在使用这些东西.如果你正在编写一个库并且它将被其他程序员使用,那么将他们想要使用的头文件组织成一个包含文件夹是很好的.如果您要创建多个库并将它们全部发布,那么您的结构可能会起作用.但是,如果它们是独立的库,并且开发并非全部一起完成并且它们在不同时间进行版本化和发布,那么您最好坚持将一个项目的所有文件放在一个文件夹中.

事实上,我会说将所有内容保存在一个文件夹中,直到你找到一个无法管理的点,然后重新组织成一个聪明的方案,将源分成你已经完成的文件夹.您可能知道如何根据遇到的问题进行组织.

KISS通常始终是编程的解决方案 - >尽可能简化一切.

  • 嗯,这可能是真的.但是,你似乎热衷于保持一切顺序,所以你可以做到!我在一家公司工作,大约有60名开发人员分成小组.几周前,许多团队花了几天时间重组他们的文件.保持组织有序是一个持续的过程......一个优秀的程序员在失控时重构代码,例如当代码文件太大而管理起来很棘手时,他们应该拆分代码.它与文件夹一样. (4认同)