@WKnight

Как понять заголовочные файлы?

Начал переносить VS2013-проект на Eclipse IDE (G++). Собственно проект состоит из одного .cpp-файла и нескольких .h, которые подключаются к нему (а некоторые - друг к другу) через #include "%filename%.h".

Насколько я смог нагуглить, существуют некоторые "как бы" соглашения о том, как нужно размещать код в заголовочных файлах. В частности, теперь Eclipse (или компилятор?..) в упор не хочет видеть данные (классы и функции) из подключаемых файлов, приходится прописывать extern-ы и прототипы, чего делать для, в общем-то, немаленького количества функций и классов не особо-то и хочется.

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

Поэтому основной вопрос такой: как в C++ просто воткнуть весь код из файла в указанное место, не плодя миллиарды .h/.c/.hpp-файлов с прототипами, реализациями и прочими #ifdef-ами, #ifndef-ами, extern и иже с ними?
  • Вопрос задан
  • 591 просмотр
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
#include — как ни странно.

Вы так и не поняли такой вещи, как «единица компиляции». Дело в том, что в Си c-файлы компилируются независимо друг от друга (в единую программу всё собирает линкер). А чтобы сказать «оно есть, только в другой единице компиляции», используют прототипы и extern’ы.

А если вы хотите просто внести код в ту же единицу компиляции, просто пишите его в хедере, да и всё. Только в большинстве компиляторов это исключает предкомпилированные хедеры — а ТАКИЕ хедеры вам предкомпилировать, скорее всего, и не нужно.

<брюзга mode on>
Не создают кода (а значит, в традиционной системе с кучей единиц компиляции находится именно в хедерах)
• extern и прототипы
• inline
• не до конца специфицированные шаблоны
• static-поля в классе (но потом это static-поле придётся повторить в какой-нибудь одной единице компиляции)
• может, ещё что-то, только я забыл…
<брюзга mode off>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы