3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
|
||||||
1 | ||||||
Вопросы по теории06.11.2011, 10:42. Показов 2000. Ответов 24
Метки нет (Все метки)
Здравствуйте, уважаемые участники форума. Начинаю изучать программирование и язык C++ в частности. И сразу же появились вопросы, теоретического так скажем плана. Задам их, допустим, на примере всеми любимого хелловорда (а на большее я пока и не способен ):
2. Какую смысловую нагрузку имеет выражение return 0 ? Зачем возвращать что-то операционной системе, и как она будет использовать это значение? Всякой ли ОС оно вообще нужно? 3. Как я понимаю, iostream - это заголовочный файл? Кстати, интересно, почему он вообще без расширения, какой это имеет смысл? И если это только заголовочный файл, то где находится реализация описанных в нём методов, в частности операторов <<, >> ? 4. И вообще, насчёт подключения файлов... В исполняемом файле связывается объектный код, написанной мною проги и объектный код из стандартной библиотеки? Туда включается вся-вся информация из подключаемого файла? Или только тот фрагмент, который касается используемых мною функций? Т.е. в примере выше, я использую лишь оператор вывода, а ввод мне не нужен. Избыточная информация об операторе >> вроде как не нужна. Но с другой стороны, директива include наверное включит всё содержимое файла? Извиняюсь, если что-то непонятно спросил. Заранее спасибо за ответы.
0
|
06.11.2011, 10:42 | |
Ответы с готовыми решениями:
24
Вопросы по теории C++ вопросы по теории Вопросы по теории Вопросы по теории кодирования |
Higher
|
|
06.11.2011, 10:49 | 2 |
Да.
Нет. Вообще найдите список операторов с++, понятнее станет. В данном случае никакую, main возвращает 0 по умолчанию. Как минимум чтобы узнать, нормально ли завершилась программа. Если программа возвращает 0 - то нормально. Может, еще для чего-нибудь нужно.
1
|
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
|
|
06.11.2011, 11:01 [ТС] | 3 |
diagon,
Спасибо, а как тогда правильно назвать всю строку, завершённую точкой с запятой? инструкцией? выражением? или как-то по-другому? То что 0 по умолчанию возвращается, это я уже понял, ага. Но если я напишу return 1, например, то с виду вроде ничего не изменится. По крайней мере, ОС не завопит: "ай-ай, прога поломалась" Так что не совсем понятно, зачем сообщать ОС, как прога завершилась...
0
|
06.11.2011, 11:06 | 4 |
Например у тебя есть две программы, они должны запускаться по очереди, т.е. вторая запускается после завершения работы первой. Работа второй программы зависит от того, как завершилась первая. Если первая вернула 0, значит вторая запускается, если не 0, значит в первой возникла какая то ошибка, и второй запускаться нет смысла.
Наглядный пример компилятор и линкер, если компилятор вернет не 0, то линкер не будет запущен. Добавлено через 53 секунды называй ее "строка", ошибки не будет)
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
06.11.2011, 12:35 | 5 |
Да. Никакого. Заголовочные файлы стандартной библиотеки без расширения - это требования актуального стандарта. Но с тем же успехом можно было бы назвать заголовочный файл iostream так: iostream.h, iostream.header, iostream.exe. Препроцессору нет никакого дела до того, какое расширение у файла: он произведет препроцессорную подстановку любого файла, который передан аргументом к директиве #include
1
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
06.11.2011, 14:10 | 6 |
Abendstern, со словами "оператор" и "операция" существует некоторая путаница.
В английском языке есть слово operator. В старые добрый времена этот термин переводили как "операция" (в смысле, например, арифметическая операция, логическая операция). Управляющие структуры в английском языке обычно назывались statement (утверждение, предложение). И в старые добрые времена этот термин переводили как "оператор" (в смысле оператор цикла, условный оператор). В настоящее время термин statement все чаще переводят как "инструкция".
1
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
06.11.2011, 14:27 | 7 |
Abendstern, очень важно понять, что #include просто вставляет указанный файл в указанное место (ну, после всякой легкой препроцессорной обработки). Как правило, там содержатся всякие объявления функций, структур, типов данных и прочее, что нужно знать транслятору, чтобы разобраться в твоем коде. Иногда там для твоей конкретной проги есть вещи ненужные, но транслятор не считает обременительным лишние знания.
На линковку это никак не влияет. Линковщик просто ищет в стандартной библиотеке нужные подпрограммы, а ежели вдруг не найдет - кричит караул. Например в Линуксе подключение #include некоторых библиотек не дает собраться программе, если не укажешь явно эти библиотеки.
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
06.11.2011, 15:13 | 8 |
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
06.11.2011, 15:19 | 9 |
ну идея еще в том, что стандартные хедеры могут вообще не быть файлами
во всяком случае стандарт не обязывает их присутствовать физически
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
06.11.2011, 16:54 | 11 |
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
06.11.2011, 17:02 | 12 |
К примеру мало написать #include <math.h> (ну или <cmath>), нужно ещё при сборке -lm указать.
Тонкостей того, откуда что берётся, не знаю, но по сути действительно так. К примеру как ни искал в CygWin-овском /usr/include файл unistd.h, так и не нашёл, при этом gcc встретив в программе #include <unistd.h> вполне нормальным образом отрабатывает...
2
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
06.11.2011, 17:02 | 13 |
2
|
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
|
|
06.11.2011, 17:19 [ТС] | 14 |
Всем спасибо за пояснения, буду разбираться дальше.
Байт, не могли бы пояснить, транслятор это то же самое что компилятор? Вообще в википедии пишут, что компилятор состоит из транслятора и компоновщика. Хм, но в книгах обычно понятия разнесены по отдельности, именно компилятор и компоновщик. Короче говоря, путаница с этими понятиями Не по теме: Может быть то что я спрашиваю, не так уж существенно (хотя, не мне пока судить), просто хочется сразу овладеть корректной терминологией, чтобы не было недопониманий при общении с программистами Итак, правильно я понимаю, директива препроцессора include вставляет текст подключаемого файла полностью, а вот на этапе линковки используется код только нужных функций? т.е. ничего "лишнего" в исполняемый файл не пройдёт? И ещё раз повторю один из вопросов: раз уж мы подключаем только хедеры, где-то же должны находиться реализации конкретных функций? Иными словами, где лежит сама эта стандартная библиотека и чем она представлена?
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
06.11.2011, 17:21 | 15 |
Любопытно... Т.е. компилятор, чтоб не мучиться, какие-то популярные хедеры держит в себе, т.е оптимизирует обращение к диску? Ну что ж, честь ему и хвала. Но для ТС, ИМХО, лучше представлять себе, что это подстановка текста из файла. А то, что он подставляется не совсем привычным образом, так чего только эти программисты не напридумают!
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
06.11.2011, 17:27 | 16 |
компилятор - одна из разновидностей трансляторов
среда сборки состоит из компилятора и линковщика(некоторые его называют компановщиком) в с/с++ есть два разных важных понятия - объявление и определение, если вы поймете что это такое - все станет ясным так вот header'ы используют для объявления, .c, .cpp используют для определения функций объявления нужны компилятору, чтобы правильно собирать отдельные модули (выставлять заглушки на неопределенные внешние функции) линковщик занимается тем, что разрешает все эти связи между модулями под модулями я понимаю скомипилированные единицы трансляции .c, .cpp -> .o, .obj
2
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
06.11.2011, 17:34 | 17 |
как оказывается (заметил где-то месяц назад), уже и не обязательно:
Код
[nameless@desktop c]$ cat main.c #include <stdio.h> #include <stdlib.h> #include <math.h> #define TEST(EXP) \ printf(#EXP " = %.2f\n", EXP) int main(void) { TEST(exp(3.)); TEST(sin(3.)); TEST(cos(3.)); TEST(log(3.)); exit(EXIT_SUCCESS); } [nameless@desktop c]$ cat Makefile | egrep -i '^(c|ld)flags' CFLAGS= -Wall -ansi -pedantic -pedantic-errors LDFLAGS= #-lm [nameless@desktop c]$ make clean && make rm -fv main.o sample *~ удалён «main.o» удалён «sample» gcc -Wall -ansi -pedantic -pedantic-errors -c -o main.o main.c gcc -o sample main.o [nameless@desktop c]$ ./sample exp(3.) = 20.09 sin(3.) = 0.14 cos(3.) = -0.99 log(3.) = 1.10 [nameless@desktop c]$ gcc --version gcc (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9)
0
|
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
|
|
06.11.2011, 18:22 [ТС] | 18 |
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:
Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
0
|
Заблокирован
|
|
06.11.2011, 18:43 | 20 |
Когда вы в свой программный модуль включаете директиву #include, то в исходный текст вашего модуля включаются все объявления, присутствующие в этом заголовочном файле за исключением теХ. которые исключаются с помощью условных директив препроцессора таких, как, например, #ifdef или #ifndef.
Если вам нужны только объявления некоторых сущностей из этого заголовочного файла таких, как, например, определение синонимов типов с помощью спецификатора typedef, или какие-нибудь заранее определенные константы, то в ваш объектный файл ничего не включается. Ежели вы используете какую-нибудь функцию, объявленную в заголовочном файле, то в ваш объектный файл включается другой объектный файл, в котором находится код этой функции, если компоновка с библиотекой у вас статическая. Этот объектный файл может содержать все функции из заголовочного файла или только выборочные. То есть объявления функций в заголовочном файле может быть разбито на несколько объектных файлов. То есть когда у вас есть вызов некоторой функции, то компилятор лезет в библиотечный файл (не путать с заголовочным файлом, где находятся лишь объявления фукнц3ий), и в этом библиотечном файле ищет объектный модуль, содержащий объектный код функции.
1
|
06.11.2011, 18:43 | |
06.11.2011, 18:43 | |
Помогаю со студенческими работами здесь
20
Вопросы по теории, синтаксису, мышлению. Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились по теории Немного теории Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |