@Alexander1705

Как подключать.h файлы во вложенных папках?

Здравствуйте. Допустим имеется проект, следующей структуры:

Project
____source
________main.cpp
________core
____________core.h
____________core.cpp
________module1
____________module1.h
____________module1.cpp
________...
________moduleN
____________moduleN.h
____________moduleN.cpp
____libs
________core.o
________mdoule1.o
________...
________mdouleN.o
____res
________a.obj
________b.obj
________c.obj
________...

Так вот вопрос в том, как правильно подключать заголовочные файлы?
  1. Как moduleN.cpp должен подключать moduleN.h?
  2. Как moduleN.cpp должен подключать moduleM.h?
  3. Нужно ли указывать пути относительно подключающего модуля или относительно корневой директории?
  4. Если один .h файл подключает другой, как он должен его подключать?


Я как ни пытаюсь, получается либо один модуль ругается, либо другой. Пользуюсь gcc.
  • Вопрос задан
  • 12861 просмотр
Решения вопроса 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
В начале каждого заголовочного файла пишем
#pragma once
Подробнее https://ru.wikipedia.org/wiki/Pragma_once

Можно указать компилятору папки в которых искать заголовочники
https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
и подключать их через <> кавычки

Или прописывать абсолютные или относительные пути в "" кавычках
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
donkaban
@donkaban
Умею рисовать тени
Просто мимо проходил.
Я бы советовал использовать вместо #pragma once классические include guards. На то есть несколько причин (и почти все они неважны, если вы под виндой)

1. Статический анализатор clang часто используется внутри разных IDE и редакторов, просто запуская анализ для каждого файла проекта. Воспримая хедер как файл реализации он обязательно ругнется на прагму, чего в случае с обычными гвардами не произойдет
2. GCC имеет отдельную оптимизацию дерева сборки, основанную на гвардах, прагмы же не обрабатываются.
3. Если у вас в проекте несколько симлинков (скажем билдсистема построила по каким-то нуждам) на один хедер - то прагма не поможет, все упадет.
Ответ написан
Комментировать
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Поиск для Visual Studio происходит в таком порядке.
1. #include "moduleN.h"
2. #include "../moduleM/moduleM.h"

Некоторые папки можно добавить в путь поиска, чтобы не писать длинные пути.

Не забывайте писать #pragma once в начале каждого *.h файла.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы