2014-09-21 2 views
0

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

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

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

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

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

+5

'Я всегда включаю файлы .cpp на свой main.cpp' - неправильно! Включите только заголовочный файл и создайте каждый исходный файл отдельно. –

+0

Соглашение с @NeilKirk. Пожалуйста, нарушите привычку файлов '# include'-ing' .cpp'. – jxh

+0

@NeilKirk и говоря «стройте каждый исходный файл отдельно», вы имеете в виду что-то вроде: g ++ main.cpp object.cpp -o main? – Mete

ответ

3

Я нашел хороший article дело с включением файлов.

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

#ifndef TEST_H 
#define TEST_H 

// class definitions goes here 

#endif 

Если есть некоторые циклическая зависимость, рассмотрит forward declaration.

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

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

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

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

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

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

TLDR:

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

У него есть несколько оправданий, чтобы использовать оба типа охранников и прагму в одно время , Может ускорить работу с компиляторами, которые знают о прагме один раз. – Paladin

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 имеют некоторые возможности для создания проектов на основе Makefiles, make - это способ обработки C/C++ проектов с давних времен.

Смежные вопросы