LINUX.ORG.RU

Инклуды в C++

 , ,


0

3
#include "module/subdirectory/myheader.h"

vs

#include "myheader.h"
+ g++ -Imymodule/subdirectory

Вопрос в том, как организовать дерево исходников так, чтобы заголовки были одинаковые как в реализации, так и в пользовательском коде, который будет использовать мой SDK?

★★★★★

Ответ на: комментарий от i-rinat

Я правильно понял, что оптимальным решением будет вынести общие заголовки в отдельную директорию?

А что по поводу yoursdk? Также создать такую директорию в моём дереве?

UVV ★★★★★ ()
Ответ на: комментарий от UVV

А что по поводу yoursdk? Также создать такую директорию в моём дереве?

Если ты и у себя в заголовках хочешь такие полные пути использовать, то проще будет создать такую директорию. При сборке добавляешь в -I путь к корню исходников, и полные пути работают.

Я правильно понял, что оптимальным решением будет вынести общие заголовки в отдельную директорию?

Но никто не запрещает тебе у себя внутри использовать относительные пути через include с кавычками. Тогда выносить не обязательно.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Про внутри то пофигу. Проблема, как я понимаю, в зависимых модулях, где такие заголовки используются в других заголовках, а не только в реализации. Т.е. как я буду использовать их в своих заголовках, так должен будет использовать их и пользователь SDK.

UVV ★★★★★ ()

Публичные хидеры в публичный include, Приватные рядом с файлами реализации.

В приватных можно писать хоть относительные, хоть абсолютные (в понятиях иерархии проекта) - это вкусовщина и принятый код-стайл.

andreyu ★★★★★ ()
Ответ на: комментарий от UVV

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

Зависимые модули могут зависимости по полным путям включать.

i-rinat ★★★★★ ()

Всегда и везде (и в коде самой библиотеки, и в клиенте)

#include <library/module/header.h>

В проекте код библиотеки лежит, соответственно, в поддиректории library/. В своём коде -I на корень проекта, в клиентском -I на системную include директорию.

slovazap ★★★★★ ()
Ответ на: комментарий от invy

Я не об этом спрашивал =) Буду придерживаться того, как slovazap предложил. Спасибо ему.

UVV ★★★★★ ()

#include «module/subdirectory/myheader.h»

#include <sdk/header.h>

#include «myheader.h»

+ g++ -Imymodule/subdirectory

Прежде всего, нужно почитать о разнице между #include <> и #include "".

tailgunner ★★★★★ ()
Ответ на: комментарий от UVV

А еще я очень сомневаюсь, что твой SDK не настолько сложен, чтобы заслужить 3-уровневое имя для публичных заголовков.

tailgunner ★★★★★ ()
Ответ на: комментарий от UVV

Т.е. валить всё в одну директорию?

Все публичные заголовки - да. Их и не должно быть много.

Ну совет на уровне, чо..

А то. Посмотри на реальные проекты и посчитай, у скольких из них трехуровневое имя. Я кроме Boost (который вообще странный) навскидку и не вспомню.

<non-normative-section>Многоуровневые имена - обычно признак того, что разработчик хочет сделать по-взрослому. У большинства это проходит вместе с юностью.</non-normative-section>

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Собсно моя идея и была в том, чтобы не плодить трёхуровневые заголовки в коде, а иметь нужное количество include directories.. но я обдумаю, может быть имет смысл сделать так, как ты сказал.

UVV ★★★★★ ()
Ответ на: комментарий от UVV

Смотри, как делают реальные проекты: GL, X11, SDL, freetype, тысячи их.

tailgunner ★★★★★ ()

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

include/mymodule/subdir/mypublicheader.h (внутри одна строчка):

#include "../../../cpp/subdir/mypublicheader.h"

cpp/subdir/mypublicheader.h
cpp/subdir/myprivateheader.h
cpp/subdir/myimplementation.cpp
cpp/myfoo.cpp

В клиентском коде:

#include <mymodule/subdir/mypublicheader.h>

В коде самой библиотеки:

subdir/myimplementation.cpp:

#include "mypublicheader.h"

myfoo.cpp:

#include "subdir/mypublicheader.h"

При использовании такого модуля из исходников клиент подключает его include-директорию через -I. При установке или создании dev-пакета скрипт проходит по однострочным хедерам в include и устанавливает файл, на который он ссылается, делается это тривиально.

Dendy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.