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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
#1

Как собирается программа при компиляции - C++

15.07.2010, 14:10. Просмотров 1306. Ответов 9
Метки нет (Все метки)

Привет всем опытным и не очень программерам!

Хочу разобраться с процессом компиляции прогарммы.

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

Объясните плз. на пальцах (простыми словами).

Рассмотрим на примере:
C++
1
2
3
4
5
6
7
8
9
10
11
//Пусть есть какя-то прога
...
#include <string.h>
#include "io.h" /* содержимое этого зоголовка я не использую обязательно ли его убирать? */
int main()
{
...
// Тут, к примеру, я использую только strlen
int ln = strlen ("Привет!");
...
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 14:10     Как собирается программа при компиляции
Посмотрите здесь:

программа выдает ошибку при компиляции - C++
подскажите, пожалуста, в чем ошибка..При компиляции выскакивает ошибка undefined reference to 'Obrabotchik::SetListContinents()' ...

Много файловая программа ошибки при компиляции - C++
Вроде всё правильно делаю но не работает. Ниже интерфейсы приведены! func.cpp #include&quot;resurse.h&quot; void put(int x) { ...

Не собирается программа из трёх файлов - C++
Добрый день! изучаю программирование и при написании программы, компилятор не хочет собирать //Gradebook.h #pragma once ...

Ошибка при компиляции, нужно чтобы программа сделала выбор - C++
Здравствуйте. Пытаюсь решить формулу (вычислить высоту треугольника) с помощью С++, не могу сделать так чтобы программа сделала выбор когда...

Почему не собирается программа? Подскажите что не так? - C++
File.h #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class File { private: ...

Программа вычисляющая интерполяционный многочлен Ньютона, останавливается при компиляции на 12 строке - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include&lt;math.h&gt; using namespace std; //Интерполяционный многочлен...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Beleaf
9 / 9 / 3
Регистрация: 14.04.2010
Сообщений: 99
15.07.2010, 15:16     Как собирается программа при компиляции #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну во-первых, компилятор просматривает программу более одного раза: сначала основную, а после подпрограммы. Первым делом выделяет место под указанные переменные и подключает нужные библиотеки. Вот почему, чем меньше переменных - тем лучше, а лишние библиотеки, как я понимаю тормозят быстродействие вашей программы. После того, как компилятор сделал все это и просмотрел вашу главную программу, он обращается к процедурам, считывая для дальнейшей работы с ними.

ЗЫ: это то, как себе представляю я, так что правильность может подводить. (:
buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51
15.07.2010, 15:25     Как собирается программа при компиляции #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Процесс компиляции разбивается на 4 этапа обработка препроцессором, компиляция, ассемблирование и связывание (линковка). Препроцессор делает 3 вещи - удаляет все коментарии, делается подстановки (#define), и включает заголовочные файлы. Как только он наткнется на строки
C
1
2
#include <string.h>
#include "io.h"
Он подключит заголовочные файлы, и подставит в исходный текст программы указанные ему файлы. Прототипы функции в заголовочных файлах, которые мы используем, помещаются перед майном. После того как весь код будет обработан препроцессором, начинается трансляция в ассемблерный код, потом ассемблирование в обьектный файл (преобразование ассемблерного кода в машинный) и линковка. Вызов функции strlen как раз будет осуществляться после линковки, т.к. до нее компилятор не будет знать где она находится у него будет только прототип и "пустой" вызов. Линковщик разрешит все эти зависимости и в процессе работы подставит в этот "пустой" вызов реальный адрес функции.
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
15.07.2010, 16:40  [ТС]     Как собирается программа при компиляции #4
Цитата Сообщение от buugman Посмотреть сообщение
Вызов функции strlen как раз будет осуществляться после линковки, т.к. до нее компилятор не будет знать где она находится у него будет только прототип и "пустой" вызов. Линковщик разрешит все эти зависимости и в процессе работы подставит в этот "пустой" вызов реальный адрес функции.
А как влиияет и на, что именно, наличие пустых (без вызовов) прототипов (подставленых после препроцессирования) функций? И будут ли эти прототипы находисться в исполняемом файле?
buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51
15.07.2010, 17:10     Как собирается программа при компиляции #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от FireNovel Посмотреть сообщение
А как влиияет и на, что именно, наличие пустых (без вызовов) прототипов (подставленых после препроцессирования) функций? И будут ли эти прототипы находисться в исполняемом файле?
В исполняемом файле не будут находиться прототипы этих функции, там вообще ничего не будет кроме системных вызовов. Думаю что они не на что не влияют кроме пары лишних строк кода, которые всеравно потом будут выполнены как только линковщик подставит адрес исполняемой функции из обьектного файла.
rrock.ru
9 / 9 / 1
Регистрация: 15.07.2010
Сообщений: 19
15.07.2010, 17:25     Как собирается программа при компиляции #6
Описание функции (которые, в принципе находятся в заголовочном файле) просто говорит компилятору, что данная функция есть, какие аргументы должны передаваться и какие её возвращаться.. но не более.. а дальше линковщик подставляет адрес вызова этой функции в то место, где она вызывается...
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
15.07.2010, 17:25     Как собирается программа при компиляции #7
Цитата Сообщение от FireNovel Посмотреть сообщение
А конкретнее, что делается с включаемыми заголовочными файлами, и функциями (прототипы которых находятся там).
Что-то типа copy-pase-а. Вставляет код исходных фаилов, в "начало" фаила.
Цитата Сообщение от FireNovel Посмотреть сообщение
важно ли не включать левые (неиспользуемые) заголовки?
нет, нет, нет и нет.
на счёт первого не уверен, но второе знаю наверняка.
поправьте.

Не по теме:

Цитата Сообщение от FireNovel Посмотреть сообщение
Привет всем опытным и не очень программерам!
второе обо мне

FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
16.07.2010, 12:24  [ТС]     Как собирается программа при компиляции #8
Цитата Сообщение от rrock.ru Посмотреть сообщение
а дальше линковщик подставляет адрес вызова этой функции в то место, где она вызывается...
Линковщик занимается подстановкой на этапе компиляции? или при выполнении программы (т.е после запуска *.exe -шника)
buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51
16.07.2010, 12:26     Как собирается программа при компиляции #9
Цитата Сообщение от FireNovel Посмотреть сообщение
Линковщик занимается подстановкой на этапе компиляции? или при выполнении программы (т.е после запуска *.exe -шника)
На этапе компиляции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2010, 12:55     Как собирается программа при компиляции
Еще ссылки по теме:

не собирается программа. fmod: неоднозначный вызов перегруженной функции - C++
помогите пожалуйста запустить программу(шифрование/дешифрование текста), код вроде правильный, но выдается пара непонятных мне ошибок....

MS Visual Studio 2013 Express при компиляции программа открывается и сразу закрывается - C++
Вот код: #include &lt;iostream&gt; int main() { std::cout &lt;&lt; &quot;Hello&quot; &lt;&lt; ; system(&quot;pause&quot;); return 0; ...

Как исправить ошибки при компиляции проекта? - C++
Недавно набросал достаточно много классов, для проекта. Но ошибок компиляции получилось почему то ну очень много. И я не понимаю как их...

Как вставлять файлы в программу при компиляции - C++
Поискав, я не нашел как вставить текст или картинку в программу при компиляции. То есть чтобы на выходе у меня остался только *.exe со...


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

Или воспользуйтесь поиском по форуму:
rrock.ru
9 / 9 / 1
Регистрация: 15.07.2010
Сообщений: 19
16.07.2010, 12:55     Как собирается программа при компиляции #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну если точнее, то на этапе сборки (линковки).. Например, если программа состоит из нескольких отдельных файлов с функциями, то IDE не перекомпилирует их все, а только те, которые изменены со времени последней компиляции.. и адрес функции в новом объектнике будет уже другой..
Yandex
Объявления
16.07.2010, 12:55     Как собирается программа при компиляции
Ответ Создать тему
Опции темы

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