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

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

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

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

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

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

Рассмотрим на примере:
C++
1
2
3
4
5
6
7
8
9
10
11
//Пусть есть какя-то прога
...
#include <string.h>
#include "io.h" /* содержимое этого зоголовка я не использую обязательно ли его убирать? */
int main()
{
...
// Тут, к примеру, я использую только strlen
int ln = strlen ("Привет!");
...
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Beleaf
9 / 9 / 3
Регистрация: 14.04.2010
Сообщений: 99
15.07.2010, 15:16     Как собирается программа при компиляции #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну во-первых, компилятор просматривает программу более одного раза: сначала основную, а после подпрограммы. Первым делом выделяет место под указанные переменные и подключает нужные библиотеки. Вот почему, чем меньше переменных - тем лучше, а лишние библиотеки, как я понимаю тормозят быстродействие вашей программы. После того, как компилятор сделал все это и просмотрел вашу главную программу, он обращается к процедурам, считывая для дальнейшей работы с ними.

ЗЫ: это то, как себе представляю я, так что правильность может подводить. (:
buugman
 Аватар для 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
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
15.07.2010, 16:40  [ТС]     Как собирается программа при компиляции #4
Цитата Сообщение от buugman Посмотреть сообщение
Вызов функции strlen как раз будет осуществляться после линковки, т.к. до нее компилятор не будет знать где она находится у него будет только прототип и "пустой" вызов. Линковщик разрешит все эти зависимости и в процессе работы подставит в этот "пустой" вызов реальный адрес функции.
А как влиияет и на, что именно, наличие пустых (без вызовов) прототипов (подставленых после препроцессирования) функций? И будут ли эти прототипы находисться в исполняемом файле?
buugman
 Аватар для 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 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
15.07.2010, 17:25     Как собирается программа при компиляции #7
Цитата Сообщение от FireNovel Посмотреть сообщение
А конкретнее, что делается с включаемыми заголовочными файлами, и функциями (прототипы которых находятся там).
Что-то типа copy-pase-а. Вставляет код исходных фаилов, в "начало" фаила.
Цитата Сообщение от FireNovel Посмотреть сообщение
важно ли не включать левые (неиспользуемые) заголовки?
нет, нет, нет и нет.
на счёт первого не уверен, но второе знаю наверняка.
поправьте.

Не по теме:

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

FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
16.07.2010, 12:24  [ТС]     Как собирается программа при компиляции #8
Цитата Сообщение от rrock.ru Посмотреть сообщение
а дальше линковщик подставляет адрес вызова этой функции в то место, где она вызывается...
Линковщик занимается подстановкой на этапе компиляции? или при выполнении программы (т.е после запуска *.exe -шника)
buugman
 Аватар для 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     Как собирается программа при компиляции
Еще ссылки по теме:

C++ C++ - Не собирается программа из трёх файлов
C++ Программа запускается, но при компиляции выдает ошибку
C++ MS Visual Studio 2013 Express при компиляции программа открывается и сразу закрывается

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

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

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