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

В чём разница между заголовками <c***> и <***.h>? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Безопасно ли использовать memcpy при выделении памяти по ходу выполнения програмы http://www.cyberforum.ru/cpp-beginners/thread672152.html
Безопасно ли использовать memcpy при выделении памяти по ходу выполнения програмы. Например: namespace { static int fieldCnt = 0; }; struct TeamResult
C++ Условный оператор if. Задание 1 Дана точка на плоскости с координатами (х, у). Составить программу, которая выдает одно из сообщений "Да", "Нет", "На границе" в зависимости от того, лежит ли точка внутри заштрихованной области, вне... http://www.cyberforum.ru/cpp-beginners/thread672126.html
C++ подпрограммаи двумерный массив
как в подпрограмму передать двумерный масив ?? #include <iostream> using namespace std; const int x = 3; const int y = 2; void my_function() {
Сортировка пузырьком C++
вот написала программу но не работает :( #include <iostream> #include <conio.h> #include <ctime> #include <cstdlib> using namespace std; int array; void *buble_sort(int length){ int...
C++ Уравнение метод ньютона? http://www.cyberforum.ru/cpp-beginners/thread672117.html
Дано уравнение f(x)=0. Найти с точностью e все корни уравнений, содержащиеся на отрезке . Для решения задачи использовать метод Ньютона. 1. Составить программу для...
C++ Метод парабол Здравствуйте помогите разобраться и реализовать метод пaрабол, для функции вида: x*x+3*sin(x)=0 int main() { setlocale(LC_ALL,""); double A=-2,B=-1,X, E=0.00001;//отрезок , E cout<<"Метод... подробнее

Показать сообщение отдельно
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
16.10.2012, 16:25
Цитата Сообщение от xtorne21st Посмотреть сообщение
Лично для меня до сих пор не понятно, в чём разница между компоновщиком и препроцессором?
Возьмем другой пример:
C++
1
2
3
4
5
6
7
#include <iostream>
#include <iostream>
#define print std::cout <<
 
int main() {
    print "Hello World";
}
Сначала работает препроцессор - он подключает файл iostream, в котором, помимо всего прочего, определен некий дефайн. Он мешает повторному включению, и ошибки не возникает. Далее находятся все отдельно стоящие слова print в исходнике и заменяются на "std::cout <<". Т. о. код приобретает следующий вид:
C++
1
2
3
4
5
//Содержимое файла <iostream>
 
int main() {
    std::cout << "Hello World";
}
После этого код обрабатывает компилятор. Он выделяет смысловые части (лексемы) и следит за тем, чтобы все переменные, функции etc были предварительно объявлены. В данном случае он проверяет существование объявления переменной std::cout, а также объявлений классов std::ostream, std::iostream и std::ios_base. На выходе компилятор генерирует объектный код, в котором вместо адресов памяти находятся символические имена.
Компоновщик (linker) просматривает все получившиеся объектные файлы и "связывает" их вместе. Он проверяет, чтобы каждая функция и переменная, к которой есть обращение, существовала в действительности. Например, в следующем коде ошибку выдаст не компилятор, а компоновщик:
C++
1
2
3
4
5
6
7
#include <iostream>
 
int myfunc();
 
int main() {
    std::cout << myfunc();//myfunc объявлена, но нигде не определена
}
Выходной файл у компоновщика - exe'шник.
3
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru