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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 03:10     В чём разница между заголовками <c***> и <***.h>? #1
Пробовал несколько несложных примеров применения обоих вариантов. Результат выполнения идентичен. Компилятор никаких предупреждений не выдавал. Так в чём-же собственно разница? Ну не даром ведь переписали для С++ стандартные библиотеки С.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
16.10.2012, 16:25     В чём разница между заголовками <c***> и <***.h>? #21
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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'шник.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 16:58  [ТС]     В чём разница между заголовками <c***> и <***.h>? #22
Хорошее разъяснение, спасибо
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
16.10.2012, 17:42     В чём разница между заголовками <c***> и <***.h>? #23
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Препроцессор работает с текстом. Компоновщик - с объектными файлами с кодом. В файле stdio.h описаны только прототипы функций (printf, scanf и т.п.), а потому на этапе препроцессирования подцепляются только прототипы функций. Реализация в виде функций находится в библиотеке (т.е. в виде бинарников), и их уже подцепляет компоновщик. Прототип функции нужен для того, чтобы компилятор знал, по каким правилам надо формировать передачу параметров, дабы не получилось дурных эффектов навроде этого: Ссылки и указатели

Добавлено через 2 минуты
Вспомнил, что когда-то об этом писал подробно: Процесс компиляции

Добавлено через 4 минуты
И ещё одна полезная тема: С++ .h файли
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 17:55  [ТС]     В чём разница между заголовками <c***> и <***.h>? #24
Статья о препроцессоре и компиляции просто отлична! Спасибо автору
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2012, 18:18     В чём разница между заголовками <c***> и <***.h>?
Еще ссылки по теме:

Не объясните в чём разница между случаями C++
C++ В чём разница?
Односвязный список: В чём разница между struct и class? C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
16.10.2012, 18:18     В чём разница между заголовками <c***> и <***.h>?
  #25

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Это действительно и для ДОСа. Просто с расширением было проще определять тип, не парся заголовок файла.)
Да не, это понятно. Я написал это к словам
Цитата Сообщение от Deviaphan Посмотреть сообщение
которые ничего не значат.
в досе убери расширение исполняемого файла, он тебе скажет, что файл не является исполняемым или формат не поддерживается

Yandex
Объявления
16.10.2012, 18:18     В чём разница между заголовками <c***> и <***.h>?
Ответ Создать тему
Опции темы

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