Определенный способ включить файлы на C ++, избегая циклических зависимостей

0

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

Итак, есть ли программное обеспечение для управления этим? Разве IDE это делает?

Я всегда включаю файлы.cpp в свой файл main.cpp, а затем включаю файлы.hpp на эти.cpp. Итак, если у меня есть main.cpp, object.hpp и object.cpp, я буду включать object.cpp в main.cpp и object.hpp на object.cpp. Есть ли лучший способ сделать это?

Могу ли я просто включить файлы.hpp, а в скрипте сборки добавить каждый.cpp файл?

Я просто не могу найти ответ в Интернете, возможно, я делаю неправильный вопрос...

  • 5
    I always include .cpp files on my main.cpp - неправильно! Включите только заголовочный файл и постройте каждый исходный файл отдельно.
  • 0
    Соглашение с @NeilKirk. Пожалуйста, избавьтесь от привычки #include -ing .cpp файлов.
Показать ещё 3 комментария
Теги:
g++
include

2 ответа

3
Лучший ответ

Я нашел хорошую статью, касающуюся включения файлов.

Общей практикой для всех c++ файлов заголовков является просто определение защиты включения.

#ifndef TEST_H
#define TEST_H

// class definitions goes here

#endif

Если есть некоторые циклические зависимости, рассмотрите форвардную декларацию.

Каждый раз, когда этот заголовок включен, компилятор проверяет, был ли уже определен символ TEST_H. Это в основном гарантирует, что содержимое этого файла включено только один раз, и поэтому существует одно объявление классов, определенное в файле заголовка.

Полезно знать, что директива "#include <>" копирует и вставляет все содержимое включенного файла.

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

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

Если вы ищете IDE, подумайте:

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

TL;DR:

  • Используйте предохранители включения
  • Включите все.cpp файлы в скрипт сборки.
  • Не "#include".cpp файлы.
  • В каждый.cpp файл включаются только нужные заголовки, чтобы сократить время компиляции.
  • 0
    Это имеет некоторое оправдание для одновременного использования обоих включает в себя охрану и прагму. Может ускорить процесс с компиляторами, которые однажды знают о прагме.
0

Я вижу много хороших предложений с хорошими практиками, но ваша ошибка (включая .cpp файлы из файла .cpp) предполагает, что вам не хватает какой-либо концепции в процессе сборки C/C++, я надеюсь, что небольшое объяснение поможет вам понять лучше и избежать ошибки.

Подумайте о файлах .c.cc.cxx.cpp качестве модулей, файл .cpp - это модуль с вашей реализацией чего-то, .h.hpp - это просто заголовки, где обычно вы не помещаете реализации, но объявления должны делиться с несколькими модули.

Обычно каждый .cpp модуль компилируется в двоичный объект g++ -c -o mymod1.o mymod1.cpp затем (как только все модули скомпилированы) соединены вместе g++ -o myprog mymod1.o mymod2.o...

Даже если вы компилируете и связываете одну команду g++ -o myprog mymod1.cpp mymod2.cpp за сценой g++ обрабатывает каждый модуль как отдельный объект.

Я думаю, важно понимать, что каждый модуль/объект ничего не знает о других, и если вам нужен какой-то другой модуль (ваш main.cpp), чтобы узнать что-то о mymod1.cpp требуется файл заголовка .h.hpp (mymod1.h) с объявлениями, необходимыми для совместного использования: глобальные переменные модуля, определения, перечисления, прототипы функций или декларации классов, а затем просто mymod1.h в модуль (модули), где вы хотите использовать что-то из своей реализации mymod1 (main.cpp).

Кроме того, вы пишете, что используете скрипт оболочки для сборки, это нормально, если в вашем проекте мало файлов, лучше было бы использовать что-то вроде make, узнать, как его использовать, потребуется некоторое время, но я бы geany что у geany есть некоторые возможности для строить проекты на основе Makefiles, make - это способ долгое время C++ проекты C/C++.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню