Форум программистов, компьютерный форум CyberForum.ru

Как соединить несколько модулей с помощью #include? - C++

Восстановить пароль Регистрация
 
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 36
30.07.2014, 12:47     Как соединить несколько модулей с помощью #include? #1
Очередная тема из разряда "просвети нуба"
Допустим, у меня есть три отдельных модуля, скажем main, ref1 и ref2. Отсюда получается 6 файлов (cpp и h для каждого)
тогда:

main.cpp:
C++
1
2
3
4
#include "main.h"
main() {
   ...
}
main.h:
C++
1
2
3
4
5
#include <...>
#include <...>
#include "ref1.h"
#include "ref2.h"
...
ref1.h
C++
1
2
#include <...>
#include <...>
ref1.cpp
C++
1
2
#include "ref1.h"
...
ref2.h
C++
1
2
#include <...>
#include <...>
ref2.cpp
C++
1
2
#include "ref2.h"
...
Насколько верна/логична такая конструкция?
У меня не получается отследить последовательность прохождения препроцессора. В общем случае инклуд работает как копипаста, и до подключения ref1.h и ref2.h все понятно, а дальше вопрос - как отслеживается связь между ref_.h и ref_.cpp со стороны заголовков. Ведь сами хидеры не ссылаются на соответствующие cpp, и, по идее, проход должен на них оборваться. И зачем в таком случае нужны #include "ref_.h" в cpp

т.е:
C++
1
2
3
4
                           |<--ref1.cpp
main.cpp ->main.h--->ref1.h-->???
                 |-->ref2.h-->???
                           |<--ref2.cpp
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2014, 12:47     Как соединить несколько модулей с помощью #include?
Посмотрите здесь:

C++ Несколько cpp модулей
C++ Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h>
C++ Подключение с помощью директивы #include нескольких функций, находящихся в разных файлах.
C++ Как избежать многократного включения модуля с помощью #include в проект?
C++ Как быстро подключить сразу несколько include
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
30.07.2014, 12:54     Как соединить несколько модулей с помощью #include? #2
Каждый cpp файл представляет отдельную единицу трансляции,
в результате которой образуются объектные коды функций, входящих в этот файл.
Совсем не обязательно в начале каждого из них вставлять #include "ref1.h"
(разве что, из одной функции файла перекрестно вызывается другая).

А вот в main.cpp эти инклюды обязательны, т.к. компилятор должен знать,
как устроены эти функции.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
30.07.2014, 12:55     Как соединить несколько модулей с помощью #include? #3
Не надо ставить include в заголовочные файлы, ставь их в cpp.
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 36
30.07.2014, 13:20  [ТС]     Как соединить несколько модулей с помощью #include? #4
Ок, выкидываем из ref_.cpp #include "ref_.h", но первый вопрос все равно остается в силе:
Сами хидеры не ссылаются на соответствующие cpp, и, по идее, проход должен на них оборваться?
C++
1
2
main.cpp ->main.h--->ref1.h-->???
                 |-->ref2.h-->???
Или среда разработки сама ищет соответствие имен между *.h и *.cpp, после чего подключает их? Не должна, вроде..
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
30.07.2014, 13:31     Как соединить несколько модулей с помощью #include? #5
Цитата Сообщение от Erik945 Посмотреть сообщение
сама ищет соответствие
Зачем искать.
Еще раз повторюсь - после компиляции Cpp файла есть набор функций в obj формате.
Линковщик после компиляции подбирает те, которые понадобились и собирает из них exe.
А .h файлы только дают компилятору информацию о том, как устроена соответствующая функция,
чтобы правильно организовать их вызов.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
30.07.2014, 13:32     Как соединить несколько модулей с помощью #include? #6
Препроцессор - тупой. Он просто вставляет содержимое (текст) соответствующего файла в то место, где встретилась директива #include.
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 36
30.07.2014, 13:44  [ТС]     Как соединить несколько модулей с помощью #include? #7
zss, вот это я как раз и пытаюсь понять. Откуда линкер знает в каком именно obj искать нужную функцию, если это нигде не прописано?
Ведь процесс сборки идет так: препроцессор -> компилятор -> линкер.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.07.2014, 14:05     Как соединить несколько модулей с помощью #include? #8
Цитата Сообщение от Erik945 Посмотреть сообщение
Откуда линкер знает в каком именно obj искать нужную функцию, если это нигде не прописано?
Это прописано в самом объектном файле и доступно линковщику.

Подключать заголовочные файлы нужно по мере необходимости.
Еесли достаточно обойтись предварительным объявлением класса, то лучше не включать один заголовочник целиков в другой.
В Вашем примере main.h вообще не нужен, refX.h должны содержать по возможности только свои типы.
refX.cpp будет содержать
C++
1
2
#include "refX.h"
// другие необходимые для refX.cpp хедеры
main.cpp будет содержать:
C++
1
2
#include "refX.h" // если нужен
// другие необходимые для main.cpp хедеры
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
30.07.2014, 16:04     Как соединить несколько модулей с помощью #include? #9
Цитата Сообщение от castaway Посмотреть сообщение
Не надо ставить include в заголовочные файлы, ставь их в cpp.
Вопрос краеуголен как вефелька.

Добавлено через 1 минуту
Erik945, какие вы хотите видеть функции в данном модуле, заголовочник с ними и подключайте в данном модуле. Все.
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 36
30.07.2014, 17:59  [ТС]     Как соединить несколько модулей с помощью #include? #10
Так откуда там берутся указатели на нужные бинарники? их должен генерить либо компилятор, либо препроцессор на основе исходного кода. И то и другое сомнительно.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.07.2014, 18:45     Как соединить несколько модулей с помощью #include? #11
Цитата Сообщение от Erik945 Посмотреть сообщение
Так откуда там берутся указатели на нужные бинарники?
У объектников есть так называемые таблицы экспорта, т.е. те функции/классы/переменные, которые видны снаружи.
Задача линкера как раз сводится к тому, что увидев использование некоторой сущности найти объектник (из предоставленного списка), в котором эта сущность реализована и доступна.

Добавлено через 42 секунды
Цитата Сообщение от Erik945 Посмотреть сообщение
их должен генерить либо компилятор
Вот компилятор их и генерит.
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 36
30.07.2014, 20:38  [ТС]     Как соединить несколько модулей с помощью #include? #12
Ну как-то, где-то стало проясняться... Спасибо.
Что почитать посоветуете? на средне - любительский уровень? А то все книги для новичков считают этот вопрос второстепенным и не рассматривают (просто пиши include и все), а для профи - очевидным, и тоже динамят.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
30.07.2014, 20:47     Как соединить несколько модулей с помощью #include? #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Erik945 Посмотреть сообщение
Так откуда там берутся указатели на нужные бинарники?
а для этого существует ключи линкера, или make файл
Цитата Сообщение от Erik945 Посмотреть сообщение
их должен генерить либо компилятор, либо препроцессор на основе исходного кода.
нет прописывают ручками
но поскольку с чистыми компиляторами/линкерами мало кто имеет дело, то это вопрос как бы сильно не афишируется
чаше всего дело имеют с IDE, а там все делается в "фоновом режиме"
подключил файл к проекту, не #include, у разных IDE это называется по разному, "Вставить в проект" "добавить в проект", и IDE сгенерит ключики для линкера

можно даже подсунуть линкеру разные объектники, например один сгенерил Си, другой Ассемблер
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 36
30.07.2014, 20:55  [ТС]     Как соединить несколько модулей с помощью #include? #14
Ясно, спасибо. Что называется, дети автоматизации
Кстати вдогонку - занятная статья по теме, может еще кому пригодится
http://pyviy.blogspot.ru/2010/12/gcc.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 20:57     Как соединить несколько модулей с помощью #include?
Еще ссылки по теме:

Чем отличается #include <cstring>, #include <string> и #include <string.h>? C++
Как подключить несколько файлов директивой #include C++
Несколько модулей с одним пространством имен C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2014, 20:57     Как соединить несколько модулей с помощью #include? #15
Цитата Сообщение от Erik945 Посмотреть сообщение
Что почитать посоветуете? на средне - любительский уровень?
Процесс компиляции
Yandex
Объявления
30.07.2014, 20:57     Как соединить несколько модулей с помощью #include?
Ответ Создать тему
Опции темы

Текущее время: 23:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru