Как макетировать код C ++: пространства имен и аналогичные имена файлов в Visual Studio 2010 - PullRequest
1 голос
/ 17 мая 2011

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

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

В основном проекте у меня есть папка с именем src, содержащая мой код src,Этот исходный код затем структурируется в различные папки, каждая из которых содержит файлы .h и .cpp.Имена файлов соответствуют именам классов.Папки соответствуют пространствам имен, поэтому каждая папка находится в своем собственном пространстве имен.

Я думал, что это довольно разумный подход, пока не обнаружил, что Visual Studio 2010 работает при таком подходе, если два файла .cpp имеют одно и то же имя (хотя ив разных папках и пространствах имен), потому что все файлы .obj помещаются в один и тот же временный каталог (Debug или Release).

Это заставило меня задуматься, как, конечно, смысл поддержания большого количества пространств имен и вложенных файлов.Пространства имен позволят вам иметь классы с одинаковыми именами и, следовательно, файлы.Некоторые специалисты Google нашли решение для индивидуального выбора конфликтующих файлов и размещения файла .obj в другом месте, но некоторые намекают на худшую производительность, и это кажется странным подходом.

Так что яМне просто интересно, это не разумный макет?Или люди обычно компилируют каждую папку в статическую библиотеку и затем связывают их?Или вы просто поддерживаете разные имена файлов?Затем вы продолжаете сопоставлять имена файлов с именами классов?Потому что, если вы это сделаете, вам также не понадобятся подпространства имен, так как весь проект может быть просто в одном пространстве имен ...

Интересно, я думаю ... не уверен, что этот вопрос конкретендовольно.Я предполагаю, что мой непосредственный вопрос (предполагая, что расположение является несколько разумным), как обойти конфликтующие файлы obj?Я просто думаю о переименовании файлов при сохранении имен классов.Но мне не очень нравится это решение.

Спасибо (простите за длинный вопрос)

PS исходная папка должна быть совместима с gcc под linux

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

IDE обычно позволяют вам упорядочивать файлы логически.(Visual Studio и XCode, по крайней мере, оба позволяют создавать иерархические группы для организации ваших исходных файлов, которые не соответствуют расположениям на диске файлов).

Поскольку большинство IDE компилируют все исходные файлы в общийПромежуточная папка для этапа компоновки. Любые исходные файлы с одинаковыми именами могут вызвать конфликт, когда второй файл для компиляции перезаписывает .o или .obj предыдущего компилятора.

Таким образом, я склонен идти спрагматичный подход: все файлы для одной цели (статическая библиотека, dylib, exe) содержатся в одной папке.Файлы, специфичные для платформы, или файлы функций, размещаются в определенных подпапках, поэтому становится проще перестроить проект для другой платформы / конфигурации, просто добавляя (или удаляя) папку с файлами за раз.Что на самом деле (задним числом) кажется наиболее полезным способом эффективного использования файловой системы.

Вместо того, чтобы создавать глубокую подструктуру, каждый раз, когда отдельная библиотека становится слишком громоздкой, я делаю новую статическую библиотеку.

Это хорошо сопоставляется с базовыми IDE структуры проекта, такими как Visual Studio и XCode, которые, как правило, подразумевают наилучшую практику для их мастеров: папка Project, содержащая несколько целевых папок, каждая из которых содержит свои исходные файлы.

0 голосов
/ 30 августа 2012

Я установил

    Properties -> C/C++ -> Output Files -> Output File Name

на

    V:\%(Directory)$(PlatformName)_$(ConfigurationName)_%(Filename).obj

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

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