Я заметил, что источник популярной библиотеки C ++ окалина имеет отдельный src
а также include
папки, содержащие *.cpp
а также *.h
файлы соответственно. Есть ли преимущество в том, чтобы делать это таким образом, вместо того, чтобы просто помещать каждый .cpp в тот же каталог, что и соответствующий .h?
Часто так проще структурировать свой код, особенно если вы собираетесь экспортировать его как API с предварительно скомпилированными библиотеками. Затем (публичные) заголовки становятся вашим API, имеет смысл хранить их отдельно от исходного кода, поскольку это часть кода, которая должна распространяться вместе с библиотекой.
Используемые варианты
module/*.{cpp,h}
— лучше всего подходит для пространственной локализации связанных файлов, хуже всего, когда необходимо применить строгую фокусировку API (обратная совместимость, выпуск или исправление и т. д.)module/{include/*.h, src/*.{cpp,h}}
— хорошо для API, хорошо для пространственной местности, мой предпочтительный выборinclude/module/*.h,src/module/*.{cpp,h}
— лучше всего подходит для API, не очень хорош для пространственного расположенияРеальных плюсов и минусов нет, ну не в общем. При разработке API (по сравнению с приложениями) вам нужно будет предоставить набор включений в вашу библиотеку, и именно эта роль заголовочных файлов заставит разработчика разрабатывать решение их отделения от источников в их файловой системе.
Я не думаю, что организация лучше, чем другая, но я могу дать вам два совета, которые помогут вам решить, что лучше для ваших проектов:
Постарайтесь максимально упростить вашу файловую иерархию. Когда дело доходит до настройки проекта, установки скриптов и контроля версий, меньше встроенных папок — меньше головной боли.
Самое главное не там, где расположены заголовочные файлы, а как они включены:
Видя, как вы хотите, чтобы ваши заголовки были написаны при вызове #include
поможет вам решить, где вам удобнее их разместить.
Насколько я понимаю, мне не очень нравится разделение заголовков / источников. Некоторые заголовки не предназначены для показа моими API, поэтому либо все мои источники находятся в одной папке, либо я предпочитаю публичное / частное разделение.