С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 37
#1

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

30.07.2014, 12:47. Просмотров 573. Ответов 14
Метки нет (Все метки)

Очередная тема из разряда "просвети нуба"
Допустим, у меня есть три отдельных модуля, скажем 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
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2014, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как соединить несколько модулей с помощью #include? (C++):

Как с помощью include подключить функцию? - C++
Я знаю, что функцию можно подключить с помощью #include &quot;&quot;; , но тогда в проекте приходится создавать ещё 2 файла, в одном(.срр)...

Как подключить отдельную функцию с помощью #include? - C++
Я сейчас изучаю функции. Мне интересно, как можно сделать так, чтобы не писать каждый раз в новой программе одну и туже функцию, а написать...

Как быстро подключить сразу несколько include - C++
Нужно сделать так, чтобы # include &quot;название .h&quot; включала в себя #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include...

Как подключить несколько файлов директивой #include - C++
Доброй ночи всем.Возникла такая проблема,нужно подключить несколько файлов одной директивой #include К примеру есть каталог ITEM.В нем...

Как избежать многократного включения модуля с помощью #include в проект? - C++
Я пытаюсь реализовать консольный графический движок, разбитый на файлы по классам. Получается достаточно запутанная фигня: &quot;main.cpp&quot;...

Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h> - C++
В типизированном файле записаны названия городов и их численность. Увеличить численность каждого города на 5% (Количество жителей всегда...

14
zss
Модератор
Эксперт С++
6587 / 6149 / 2025
Регистрация: 18.12.2011
Сообщений: 16,029
Завершенные тесты: 1
30.07.2014, 12:54 #2
Каждый cpp файл представляет отдельную единицу трансляции,
в результате которой образуются объектные коды функций, входящих в этот файл.
Совсем не обязательно в начале каждого из них вставлять #include "ref1.h"
(разве что, из одной функции файла перекрестно вызывается другая).

А вот в main.cpp эти инклюды обязательны, т.к. компилятор должен знать,
как устроены эти функции.
1
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
30.07.2014, 12:55 #3
Не надо ставить include в заголовочные файлы, ставь их в cpp.
0
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 37
30.07.2014, 13:20  [ТС] #4
Ок, выкидываем из ref_.cpp #include "ref_.h", но первый вопрос все равно остается в силе:
Сами хидеры не ссылаются на соответствующие cpp, и, по идее, проход должен на них оборваться?
C++
1
2
main.cpp ->main.h--->ref1.h-->???
                 |-->ref2.h-->???
Или среда разработки сама ищет соответствие имен между *.h и *.cpp, после чего подключает их? Не должна, вроде..
0
zss
Модератор
Эксперт С++
6587 / 6149 / 2025
Регистрация: 18.12.2011
Сообщений: 16,029
Завершенные тесты: 1
30.07.2014, 13:31 #5
Цитата Сообщение от Erik945 Посмотреть сообщение
сама ищет соответствие
Зачем искать.
Еще раз повторюсь - после компиляции Cpp файла есть набор функций в obj формате.
Линковщик после компиляции подбирает те, которые понадобились и собирает из них exe.
А .h файлы только дают компилятору информацию о том, как устроена соответствующая функция,
чтобы правильно организовать их вызов.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
30.07.2014, 13:32 #6
Препроцессор - тупой. Он просто вставляет содержимое (текст) соответствующего файла в то место, где встретилась директива #include.
0
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 37
30.07.2014, 13:44  [ТС] #7
zss, вот это я как раз и пытаюсь понять. Откуда линкер знает в каком именно obj искать нужную функцию, если это нигде не прописано?
Ведь процесс сборки идет так: препроцессор -> компилятор -> линкер.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.07.2014, 14:05 #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 хедеры
1
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
30.07.2014, 16:04 #9
Цитата Сообщение от castaway Посмотреть сообщение
Не надо ставить include в заголовочные файлы, ставь их в cpp.
Вопрос краеуголен как вефелька.

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

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

можно даже подсунуть линкеру разные объектники, например один сгенерил Си, другой Ассемблер
1
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 37
30.07.2014, 20:55  [ТС] #14
Ясно, спасибо. Что называется, дети автоматизации
Кстати вдогонку - занятная статья по теме, может еще кому пригодится
http://pyviy.blogspot.ru/2010/12/gcc.html
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2014, 20:57 #15
Цитата Сообщение от Erik945 Посмотреть сообщение
Что почитать посоветуете? на средне - любительский уровень?
Процесс компиляции
0
30.07.2014, 20:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 20:57
Привет! Вот еще темы с ответами:

#include<iostream>// подключение библиотек #include <conio.h> #include <climits> - C++
помогите для этой программы сделать блок-схему. Пожалуйста #include&lt;iostream&gt;// подключение библиотек #include &lt;conio.h&gt; #include...

Несколько cpp модулей - C++
разрабатывая один проект наталкнулся на такую фичу/баг unit1.h int al; unit1.cpp #include &quot;windows.h&quot; #include...

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

Несколько модулей с одним пространством имен - C++
Хочу сделать несколько модулей ,с разными пространствами имен .Но ,чтобы при этом они бы ли в одном более общем пространстве имен ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.