Как мне сделать макет моей программы на C ++? (куда мне положить файлы .h и .cpp?) - PullRequest
8 голосов
/ 24 февраля 2010

В настоящее время я программирую на Java и довольно часто использую Maven. Поэтому я привык к схемам имен и структурам папок, которые я использовал в течение последних 4 или 5 лет.

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

Существуют ли стандарты для такого рода вещей?

Ясно, что нет однозначного ответа на этот вопрос. Я просто ищу хорошего гида. Я не хочу начинать изучать C ++, тратя слишком много времени на беспокойство о том, как мои файлы размещены. Я предпочел бы иметь несколько хороших моделей и просто перейти к кодированию.

Ответы [ 4 ]

5 голосов
/ 24 февраля 2010

Следующее довольно типично ...

third-party library
  release
    obj
  debug
    obj
  include
  src
    sublib 1
    sublib 2

mylibrary
  release
    obj
  debug
    obj
  include
  src
    sublib 1
    sublib 2

myapp
  release
    obj
  debug
    obj
  subapp 1
  subapp 2

mylittleapp
  release
    obj
  debug
    obj

По сути, подпапки для подпроектов являются общими для более крупных проектов, но в большинстве случаев у определенного проекта есть папки для src, include и т. Д. Папка для каждой конфигурации сборки является общей, и в ней хранятся файлы obj и другие промежуточные файлы в подпапке хорошая идея. Может быть заманчиво помещать подпроектные папки в папки obj, но обычно это не нужно - папки obj не должны быть хорошо организованы, поэтому единственное беспокойство вызывает конфликт имен файлов, и лучшим решением для этого является использование уникальных исходных имен файлов в пределах (как минимум) каждого проекта.

Папки «include» должны в IMO содержать только заголовки, которые будут # включены другими проектами - внутренние заголовки находятся в папке «src».

Поместить элементы пользовательского интерфейса в отдельную папку - неплохая идея, если она достаточно большая. Я видел, как пользовательский интерфейс выполнялся как отдельный статически связанный проект верхнего уровня, и здесь я имею в виду специфическое для приложения, а не (например) wxWidgets. Обычно, тем не менее, этот уровень разделения - это подпроект , если , то стоит вообще отделиться. То, как вы разделяете подпроекты, в большей степени зависит от конкретных блоков приложения, поэтому оно зависит от того, лучше ли обрабатывать элементы пользовательского интерфейса как отдельный блок или как отдельные чанки, смешанные с логикой конкретной задачи.

Пространства имен - не самая используемая языковая функция, возможно, потому, что многие люди используют «использование» настолько, что не имеют большого значения. Пространство имен для проекта основной библиотеки имеет смысл, но я не видел привязки подпапок к пространствам имен 1: 1. У меня лично есть пространство имен, которое охватывает большую часть моего библиотечного кода, с парой подпространств имен для вещей, редко используемых в общем, но часто используемых в нескольких местах (например, «побитовые» пространства имен). Под-пространства имен ограничены одной парой источник / заголовок, поэтому нет необходимости во вложенных папках. Большая часть выбора для конкретной библиотеки выполняется путем включения правильного заголовка, за исключением того, что я обычно включаю лот через заголовок верхнего уровня основного проекта.

По сути, пространства имен - это способ избежать конфликтов имен. Они не обязательно ассоциируются с абстракциями, функциональными блоками или чем-то еще. В конкретном проекте вам, вероятно, лучше просто убедиться, что имена не конфликтуют. Как и в случае пространства имен "std", можно поместить lot материала в одно пространство имен.

Тем не менее, как вы говорите, это не окончательный ответ - конечно, есть небольшие различия и совершенно разные подходы.

1 голос
/ 24 февраля 2010

Я разбиваю свои проекты по темам, один каталог для темы:

menu_planner
  src
     recipes
       debug -- contains debug object files and libraries
       release -- contains release object files and libraries
       obsolete -- contains obsolete source files
     ingredients
       debug -- contains debug object files and libraries
       release -- contains release object files and libraries
       obsolete -- contains obsolete source files
     references
       debug -- contains debug object files and libraries
       release -- contains release object files and libraries
       obsolete -- contains obsolete source files
     meals
       debug -- contains debug object files and libraries
       release -- contains release object files and libraries
       obsolete -- contains obsolete source files
     menus
       debug -- contains debug object files and libraries
       release -- contains release object files and libraries
       obsolete -- contains obsolete source files
  docs
     designs

Мой опыт работы с C и C ++ показал мне, что файлы header и source должны находиться в одном каталоге. Часто найти заголовочный файл сложнее, если он не находится в том же каталоге, что и исходный файл.

Хорошая идея - один каталог (папка) для каждой концепции. Любое сложное или составное понятие должно быть разбито на несколько папок или понятий.

Я также научился создавать библиотеки. Я использую библиотеки, чтобы содержать код, который не сильно меняется. Шаг связывания выполняется быстрее с библиотеками, чем с каталогами объектных файлов.

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

1 голос
/ 24 февраля 2010

В небольших проектах моя команда группирует все файлы с помощью блока ссылок, т.е. библиотеки, DLL, EXE. Если модуль очень большой, мы иногда разбиваем файлы по функциональным единицам или подсистемам, поэтому, если вам нужно отредактировать компонент, они обычно находятся в одном месте.

0 голосов
/ 06 января 2014

Не обязательно, чтобы ваши заголовочные файлы и файлы cpp находились в одной папке. Я делал это много раз. Вы можете хранить их в разных папках и использовать другой файл для извлечения / включения обоих файлов в файл, который вы будете использовать в качестве включаемого. Посетите ссылку ниже, чтобы лучше понять, что я говорю. Он показывает, как реализовать собственную структуру организации файлов.

http://codednotes.blogspot.com/2014/01/organising-headers-and-source-files.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...