Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785

Многофайловый проект

27.03.2017, 03:22. Показов 5560. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравия всем! Опять зеленый метушится!

Перед, непосредственно, главным вопросом, хочу показать то, что мне известно (если я не заблуждаюсь).
Если обобщить, понимаю, что есть следующие 3 основных этапа сборки программы:
1) препроцессирование;
2) компиляция;
3) линковка.
Как работает препроцессор, мне известно (или, по крайней мере, имею понятие). Представление компиляции и линковки тоже имеется.

Не знаю как правильно задать вопрос, поэтому попытаюсь привести пример в коде.
Вот, у нас есть book.cpp-файл с таким содержимым:
C++
1
2
#include "book.h"
int foo() { return 42; }
И, book.h-файл выглядит вот так:
C++
1
2
3
4
#ifndef _BOOK_H_
#define _BOOK_H_
int foo();
#endif
Теперь я решил написать программу, которая бы использовала функцию, определенную в book.cpp:
C++
1
2
3
4
5
6
7
8
9
// main.cpp
#include "book.h"
 
int main()
{
  int existence = foo();
 
  return 0;
}
Все скомпилировалось, все отлично, все довольны (кроме меня).

Вот что меня интересует: директива препроцессора include берет все содержимое из файла book.h и вставляет в main.cpp. Но в book.h содержится только лишь объявление функции foo(), а не ее реализация. Каким образом функция вызывается, если в коде ее нет?

Если возможно, объясните на уровне "день -- это когда видишь, ночь -- это когда не видишь"
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2017, 03:22
Ответы с готовыми решениями:

Многофайловый проект
Всем привет, уже довольно долго пытаюсь собрать проект из трех файлов: заголовочный, файл реализации функций, главный файл с вызовом...

Многофайловый проект
Доброго времени суток. В проекте 4 файла. Почему при первом варианте все работает, а во втором нет? // main.cpp #include...

Многофайловый проект в VS
Всем привет. Добавил новый элемент .cpp в свой проект, в котором уже есть другой .cpp, и компилятор отказывается компилировать новый...

11
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.03.2017, 05:49
Лучший ответ Сообщение было отмечено Captain Maxee как решение

Решение

Вот тут, вроде, толково расписано.
https://habrahabr.ru/post/150327/
2
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
27.03.2017, 12:31
Процесс компиляции
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.03.2017, 13:29
Лучший ответ Сообщение было отмечено Captain Maxee как решение

Решение

Цитата Сообщение от Captain Maxee Посмотреть сообщение
директива препроцессора include
Простая как палка, тупо вставляет весь текст, то есть после работы препроцессора в main.cpp будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
// main.cpp
#ifndef _BOOK_H_
#define _BOOK_H_
int foo();
#endif
 
int main()
{
  int existence = foo();
 
  return 0;
}
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Каким образом функция вызывается, если в коде ее нет?
Об этом заботится линкер. Для компилятора же важно лишь чтобы было видно определение класса/функции. А уж где это находится - в соседнем файле, либе и т.д. - дело компоновщика.
1
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.03.2017, 22:22  [ТС]
MrGluck,
Цитата Сообщение от MrGluck Посмотреть сообщение
Об этом заботится линкер. Для компилятора же важно лишь чтобы было видно определение класса/функции. А уж где это находится - в соседнем файле, либе и т.д. - дело компоновщика.
-- это стало понятно, после прочтения статей, которые скинули уважаемые nd2 и GbaLog-.
Непонятно осталось следующее: что же будет, если существует два .cpp-файла:
C++
1
2
3
// book1.cpp
#include "book.h"
int foo() { return 42; }
C++
1
2
3
// book2.cpp
#include "book.h"
int foo() { return -42; }
И book.h-файл:
Цитата Сообщение от Captain Maxee Посмотреть сообщение
C++
1
2
3
4
#ifndef _BOOK_H_
#define _BOOK_H_
int foo();
#endif
Что произойдет здесь?
Цитата Сообщение от Captain Maxee Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
// main.cpp
#include "book.h"
 
int main()
{
  int existence = foo();
 
  return 0;
}
Если ошибка при компиляции (что-то вроде "Больше одного определения функции foo(void)), то появляется такой вопрос: линкер "заглядывает" в тот .cpp-файл, где есть строка #include "book.h"?

Скрыто, во имя сохранности пока положительной репутации самого меня
Ребята, я понимаю как сейчас я выгляжу в ваших глазах, но я очень дотошный педант, если за что-то берусь, то хочу понять до конца (если это возможно (ибо, в моем случае, познаю это только относительно)).
В моей картине сейчас такая каша: "Каким образом линкер выбирает реализацию функции foo из book.cpp, если в book.h лежит лишь объявление некой функции foo, без указания на файл book.cpp? Может, дело в самом файле book.cpp? Может, строчка с include все решает? Ведь может быть много файликов .cpp с реализацией функции foo... почему линкер выбирает именно book.cpp?"
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.03.2017, 22:27
Цитата Сообщение от Captain Maxee Посмотреть сообщение
линкер "заглядывает" в тот .cpp-файл, где есть строка #include "book.h"?
#include "book.h" можно убрать из файлов с реализациями функции, и ничего не изменится, линкеру он не нужен. Нужен от компилятору там, где есть вызовы функции.
1
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.03.2017, 22:36  [ТС]
nd2, Возьмем тот же код:
Цитата Сообщение от Captain Maxee Посмотреть сообщение
C++
1
2
// book1.cpp
int foo() { return 42; }
Цитата Сообщение от Captain Maxee Посмотреть сообщение
C++
1
2
// book2.cpp
int foo() { return -42; }
Цитата Сообщение от Captain Maxee Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
// main.cpp
#include "book.h"
 
int main()
{
  int existence = foo();
 
  return 0;
}
То бишь, будет error с похожим объяснением: "Больше одного определения функции foo!"? Кажется, теперь я начинаю понимать, зачем нужны пространства имен.
0
-16 / 14 / 3
Регистрация: 22.01.2013
Сообщений: 154
28.03.2017, 22:42
Не, не так. Двойное определение, по-моему, к пространству имён не лепится.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.03.2017, 22:43
Лучший ответ Сообщение было отмечено Captain Maxee как решение

Решение

Цитата Сообщение от Captain Maxee Посмотреть сообщение
Возьмем тот же код:
Возьмём.
Цитата Сообщение от Captain Maxee Посмотреть сообщение
То бишь, будет error с похожим объяснением: "Больше одного определения функции foo!"?
Будет. Линкер, в отличие от компилятора, видит все файла проекта.
1
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.03.2017, 22:57  [ТС]
nd2, Хм. Кажется, я понял!
Спасибо всем, ребята. Если есть какие-нибудь интересные плюшки, пишите, не стесняемся
0
-16 / 14 / 3
Регистрация: 22.01.2013
Сообщений: 154
28.03.2017, 23:17
Напиши оператор While.
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.03.2017, 23:19  [ТС]
gavrasio, рапорт на тебя напишу лучше. Заняться нечем больше?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.03.2017, 23:19
Помогаю со студенческими работами здесь

Многофайловый проект
Здравствуйте! Помогите создать Многофайловый проект. Пожалуйста. Создать абстрактный класс Figure с виртуальными методами...

Многофайловый проект
1й файл main.cpp #include <iostream> #include <locale> #include <Windows.h> #include "My_Struct.h" using namespace std; ...

Многофайловый проект
Собственно вопрос, скорее, к работе devc++ Ну вот захотел для "завтраки" собрать МП из 2 файлов 1 - main.cpp (ну как иначе) #include...

Многофайловый проект
Таки всеми правдами и неправдами создал из 3 файлов "тестик". И собственно не хочет это дело компилировать. Где я тут напортачил ? :( 1.)...

Многофайловый проект
Вот есть код. Помоги. Разбейте его на модуль. Я не понимаю как это сделать #include <iostream> using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru