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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

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

16.10.2012, 03:10. Просмотров 1699. Ответов 24
Метки нет (Все метки)

Пробовал несколько несложных примеров применения обоих вариантов. Результат выполнения идентичен. Компилятор никаких предупреждений не выдавал. Так в чём-же собственно разница? Ну не даром ведь переписали для С++ стандартные библиотеки С.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 03:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чём разница между заголовками <c***> и <***.h>? (C++):

В чём разница между процедурами и функциями ? - C++
Мне просто нужно будет выполнить одну и ту же операцию несколько раз, а сама операция включает в себя несколько вычислений , создание...

Не объясните в чём разница между случаями - C++
Привет! Тут вот небольшой вопросик по поводу. Читаю книжку Страуструпа нашего и возник вопросик. ...

В чём разница между string и символьными массивами? - C++
Собсна какая тема, такой и вопрос. Если выразить его по-точнее, то в чём существенные плюсы того и другого в разных ситуациях? Изучаю С++...

Односвязный список: В чём разница между struct и class? - C++
После неудач работы с Vector, а так же отсутствия (Хотя, скорее всего, я просто плохо искал) хорошей русской документации по нему, решил...

В чём разница между состояниями потока failbit и badbit? - C++
В чём разница между failbit и badbit? Если просто просматривать ошибку ввода в моём случае, то он всегда пишет failbit (в цикле вайл при...

В чём разница между динамической и статической линковкой библиотеки? - C++
В чём разница между динамической и статической линковкой библиотеки? Если можно с примером.

24
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.10.2012, 14:11 #16
Цитата Сообщение от alex_x_x Посмотреть сообщение
по стандарту системный хедер может не быть файлом - именно так

Приведи пример такого хэдэра, пжалста.


Цитата Сообщение от Kastaneda Посмотреть сообщение
скажи это DOS'у
Это действительно и для ДОСа. Просто с расширением было проще определять тип, не парся заголовок файла.)
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 14:16  [ТС] #17
Цитата Сообщение от alex_x_x Посмотреть сообщение
nope
по стандарту системный хедер может не быть файлом - именно так
его включение может приводить к какой-то реакции компилятора, избегаю включения текста какого-либо файла
Я думал, что к какой то реакции компилятора или препроцессора приводит директивы препроцессора, а включение заголовка расширяет область видимости. Что-то я совсем запутался...
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 412
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
16.10.2012, 14:22 #18
Цитата Сообщение от xtorne21st Посмотреть сообщение
а включение заголовка расширяет область видимости
Для чего нужен define?
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 14:57  [ТС] #19
Чтобы окончательно разобраться по этой теме нужно (на мой взгляд) хорошо понимать как устроена реализация программы. Лично для меня до сих пор не понятно в чём разница между компоновщиком и препроцессором? Ведь по сути они выполняют одно и тоже?
Допустим если код:
C++
1
2
3
4
5
6
#include <iostream>
 
int main()
{
std::cout << "Hello World";
}
Можете, если вас не затруднит, поэтапно изложить процесс реализации этой программы.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.10.2012, 15:32 #20
Цитата Сообщение от Deviaphan Посмотреть сообщение
Приведи пример такого хэдэра, пжалста.
пример не приведу, но вот цитата из стандарта - прям щас открыл

17.4.1.2 Headers
1 The elements of the C++ Standard Library are declared or defined (as appropriate) in a header (158)
(158) A header is not necessarily a source file, nor are the sequences delimited by < and > in header names necessarily valid source file names (16.2).
воот помню перетирали Вопросы по теории
0
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
16.10.2012, 16:25 #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'шник.
3
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 16:58  [ТС] #22
Хорошее разъяснение, спасибо
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 412
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
16.10.2012, 17:42 #23
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Препроцессор работает с текстом. Компоновщик - с объектными файлами с кодом. В файле stdio.h описаны только прототипы функций (printf, scanf и т.п.), а потому на этапе препроцессирования подцепляются только прототипы функций. Реализация в виде функций находится в библиотеке (т.е. в виде бинарников), и их уже подцепляет компоновщик. Прототип функции нужен для того, чтобы компилятор знал, по каким правилам надо формировать передачу параметров, дабы не получилось дурных эффектов навроде этого: Ссылки и указатели

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

Добавлено через 4 минуты
И ещё одна полезная тема: С++ .h файли
3
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 17:55  [ТС] #24
Статья о препроцессоре и компиляции просто отлична! Спасибо автору
0
Kastaneda
16.10.2012, 18:18     В чём разница между заголовками <c***> и <***.h>?
  #25

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2012, 18:18
Привет! Вот еще темы с ответами:

Различные варианты инициализации указателя - в чём точная разница между ними? - C++
Немного непонятен один момент. Есть некий класс Statement (конструктор используется по умолчанию). Вот четыре различных записи...

C++ и C. В чём разница? - C++
Всем доброго времени суток. Недавно разбирал сортировки в с++. Написал быструю и слияние. Вроде бы работает нормально. Спустя некоторое...

В чём разница? - C++
Здрасьте. Здесь представлены два способа присвоения переменной A значения 10. Через конструктор: class random { public:...

(char)xx и '\xx' - в чём разница? - C++
День добрый. Просто любопытно, почему cout &lt;&lt; (char)число; и cout &lt;&lt; '\число'; часто дают разный результат?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.10.2012, 18:18
Ответ Создать тему
Опции темы

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