Дерево файлов проекта - PullRequest
       2

Дерево файлов проекта

4 голосов
/ 06 января 2011

Есть ли какие-нибудь статьи или рекомендации, как организовать файловую иерархию в вашем проекте? Меня интересует, как называть папки, разделять источники и заголовки или нет.

У меня есть проект, написанный на C ++, библиотека и проект, использующий его. Библиотека имеет много компонентов, они отделены друг от друга, но некоторые из них используют общие файлы. Должен ли я создавать для них каталоги?

Буду рад услышать все рекомендации.

Ответы [ 3 ]

6 голосов
/ 06 января 2011

Не разбивайте заголовки и исходные файлы на отдельные папки. Он не делает ничего, кроме добавления дополнительного уровня папки.

В лучшем случае это совершенно бесполезно; если вы ищете «widget.h», вы можете найти его тривиально, даже если рядом с ним есть «widget.cpp». В худшем случае это довольно контрпродуктивно - например, когда вы редактируете "widget.h" и обнаруживаете, что вам также необходимо обновить "widget.cpp".

3 голосов
/ 06 января 2011

Хорошо хранить свои пространства имен в отдельных папках.Вложите пространства имен так же, как они вложены в ваш проект.Например, если у вас есть:

namespace Foo{ namespace Bar{ } }

, вы хотите, чтобы любые объекты в пространстве имен Bar находились в

{Foo's parent folder}\Foo\Bar\{how you're organizing code at this level}

Мы используемпапка include для заголовков, исходный код для .cpp, папка test для модульных тестов и папка объектов для битов скомпилированного кода.Причина, по которой мы их разделяем, заключается в том, что это упрощает упаковку кода в наших скриптах.Вы всегда будете раздавать заголовки, вы не будете разносить источник.( Здесь - еще один SO-поток, обсуждающий разделение заголовочных / исходных файлов. Это предпочтение.)

Вот ссылка на рекомендации Google по стилю, если это поможет.

2 голосов
/ 06 января 2011
  • Я не отделяю заголовки от источника: это неудобно для просмотра
  • У меня обычно подкаталоги совпадают с моими пространствами имен

    + Project root
        + <project_name>   // namespace project
            - sub_dir_1    // namespace project::sub_dir_1
            - sub_dir_2    // namespace project::sub_dir_2
    
  • Я добавляю «Корень проекта» только в качестве дополнительного пути включения, поэтому включаемые файлы имеют вид:

    #include "project/sub_dir_1/a.h"
    #include "project/sub_dir_2/b.h"
    
  • Поскольку источник и заголовок обычно называются в соответствии с классом, который они содержат,все квалифицированные имена могут быть выведены из пути включения:

    project::sub_dir_1::a находится в project/sub_dir_1/a.h

  • a.c тривиально включает в себя a.h (относительный путьпри условии)

  • Если я должен включить a.h из b.h, я использую абсолютный путь (начиная с корня project/)
...