2015-06-08 2 views
2

У меня возникли проблемы с пониманием an answer I saw in another post. Он сказал, что хорошей практикой является определение структуры в отдельном файле .h, чтобы ее можно было использовать в других файлах. Я думаю, что это здорово, и это решает мою текущую дилемму, однако у меня есть вопрос о компиляции и make-файлах. Я только знаком с файлами заголовков, которые связаны с .cpp-файлами на данный момент.Создание прототипов C++ в отдельном файле заголовка

Может кто-нибудь объяснить, как эта реализация будет выглядеть, когда у меня есть .h и нет .cpp? Нужен ли мне файл реализации? Кроме того, как мне связать заголовок в make-файле? В настоящее время я знаю, как скомпилировать заголовок .cpp & в файл .o и связать их.

Спасибо, и извините за возвращение нас в детский сад C++. Это новое откровение и кажется хорошим.

ответ

2

Ключевым понятием является то, что вы определить структуры/класса в .h заголовке, так что вы можете использовать это в нескольких .cpp файлов. Всякий раз, когда вам нужно struct foo, определенное в foo.h, вы #include "foo.h". Вам не нужно напрямую компилировать файл заголовка, он будет втягиваться в зависимости от того, какой исходный файл использует его. Поэтому вам не нужна цель make для .h в обычных условиях.

Если определение в заголовке никогда не используется, оно не будет втягиваться, и все.

+0

Спасибо за быструю обратную связь, я узнаю что-то новое от вас, ребята, каждый день! – mullock

3

Для каждого файла заголовка .h вам не нужен соответствующий исходный файл (.c или .cpp).

Имея заголовочные файлы без соответствующих исходных файлов, это нормально.

Когда вы #include какой-то файл заголовка, вы можете думать об этом как своего рода «копировать и вставить» операцию: Препроцессор копирует содержимое заголовка файла и вставляет его в точке включения.
(Ну, есть некоторые детали, чтобы рассмотреть здесь, например, наличие #pragma once директивы или некоторые #ifdef включение охранник может предотвратить множественные включения одного и того же файла заголовка в данном проекте.)

: C и Затем компиляторы C++ обрабатывают весь «блок компиляции», то есть текущий исходный файл со всеми включенными заголовками.

+0

Различие между заголовочным файлом и блоком компиляции также важно с другой точки зрения: блок компиляции (.cpp + .h) компилируется в машинный код, который отправляется, то есть в программу или в библиотеку. Чтобы использовать API библиотеки, вам нужен заголовочный файл (clear-text), а также, конечно, сама библиотека. Однако исходный код, содержащийся в файлах .cpp, не нужно отправлять. – Technaton

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