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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
#1

Вопросы по теории - C++

06.11.2011, 10:42. Просмотров 1217. Ответов 24
Метки нет (Все метки)

Здравствуйте, уважаемые участники форума. Начинаю изучать программирование и язык C++ в частности. И сразу же появились вопросы, теоретического так скажем плана. Задам их, допустим, на примере всеми любимого хелловорда (а на большее я пока и не способен ):

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    std::cout << "Hello people!\n";
 
    system("pause");
    return 0;
}
1. Сначала немного о терминологии, я если честно, запутался немного, что такое оператор, операция, выражение, ещё встречал термин инструкция... Дабы в дальнейшем грамотно изъясняться, я бы хотел прояснить этот момент. Допустим, << это оператор? или вся строка будет называться оператором?

2. Какую смысловую нагрузку имеет выражение return 0 ? Зачем возвращать что-то операционной системе, и как она будет использовать это значение? Всякой ли ОС оно вообще нужно?

3. Как я понимаю, iostream - это заголовочный файл? Кстати, интересно, почему он вообще без расширения, какой это имеет смысл? И если это только заголовочный файл, то где находится реализация описанных в нём методов, в частности операторов <<, >> ?

4. И вообще, насчёт подключения файлов... В исполняемом файле связывается объектный код, написанной мною проги и объектный код из стандартной библиотеки? Туда включается вся-вся информация из подключаемого файла? Или только тот фрагмент, который касается используемых мною функций? Т.е. в примере выше, я использую лишь оператор вывода, а ввод мне не нужен. Избыточная информация об операторе >> вроде как не нужна. Но с другой стороны, директива include наверное включит всё содержимое файла?

Извиняюсь, если что-то непонятно спросил. Заранее спасибо за ответы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 10:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопросы по теории (C++):

Вопросы по теории C++ - C++
Есть несколько вопросов по теории C++ 1)Что такое функция пользователя 2)Как инициализировать указатель Если можно , то без всяких...

вопросы по теории - C++
помогите ответить на вопросы по теории!! Тема - СТРУКТУРЫ 1) способы обьявления струкутрных переменных. Динамическое выделение...

Вопросы - C++
Здравствуйте! 1. Как сделать так, чтобы программа (функция (strlen() ) не считала пробелы? 2. Можно ли упростить (сократить)...

Вопросы по С++ - C++
1) Чем отличается const *char от сhar при использовании в программах? 2) Тип void * так и не понял как и что с ним делать. Видел в...

Вопросы по C++ - C++
Пожалуй начну) Можно ли в С++, обьявить определенному элементу массива определенное значение, как можно в пхп? Приведу пример: php:...

Вопросы!!! - C++
прошу посоветовать что почитать чтобы ответить на следующие вопросы!!(можно ответить ссылками) если будут промеры по теме буду рад:) ...

24
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 17:27 #16
Цитата Сообщение от Abendstern Посмотреть сообщение
транслятор это то же самое что компилятор
компилятор - одна из разновидностей трансляторов

Цитата Сообщение от Abendstern Посмотреть сообщение
ообще в википедии пишут, что компилятор состоит из транслятора и компоновщика.
среда сборки состоит из компилятора и линковщика(некоторые его называют компановщиком)

Цитата Сообщение от Abendstern Посмотреть сообщение
Итак, правильно я понимаю, директива препроцессора include вставляет текст подключаемого файла полностью, а вот на этапе линковки используется код только нужных функций?
в с/с++ есть два разных важных понятия - объявление и определение, если вы поймете что это такое - все станет ясным
так вот header'ы используют для объявления, .c, .cpp используют для определения функций
объявления нужны компилятору, чтобы правильно собирать отдельные модули (выставлять заглушки на неопределенные внешние функции)
линковщик занимается тем, что разрешает все эти связи между модулями
под модулями я понимаю скомипилированные единицы трансляции .c, .cpp -> .o, .obj
2
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
06.11.2011, 17:34 #17
Цитата Сообщение от easybudda Посмотреть сообщение
К примеру мало написать #include <math.h> (ну или <cmath>), нужно ещё при сборке -lm указать
как оказывается (заметил где-то месяц назад), уже и не обязательно:
Код
[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)
Хотя в манах до сих пор написано про -lm
0
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 18:22  [ТС] #18
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
0
Байт
Эксперт C
16135 / 10413 / 1549
Регистрация: 24.12.2010
Сообщений: 19,713
06.11.2011, 18:42 #19
Цитата Сообщение от Abendstern Посмотреть сообщение
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
Смеете.
0
Сыроежка
Заблокирован
06.11.2011, 18:43 #20
Цитата Сообщение от Abendstern Посмотреть сообщение
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
Когда вы в свой программный модуль включаете директиву #include, то в исходный текст вашего модуля включаются все объявления, присутствующие в этом заголовочном файле за исключением теХ. которые исключаются с помощью условных директив препроцессора таких, как, например, #ifdef или #ifndef.

Если вам нужны только объявления некоторых сущностей из этого заголовочного файла таких, как, например, определение синонимов типов с помощью спецификатора typedef, или какие-нибудь заранее определенные константы, то в ваш объектный файл ничего не включается.

Ежели вы используете какую-нибудь функцию, объявленную в заголовочном файле, то в ваш объектный файл включается другой объектный файл, в котором находится код этой функции, если компоновка с библиотекой у вас статическая. Этот объектный файл может содержать все функции из заголовочного файла или только выборочные. То есть объявления функций в заголовочном файле может быть разбито на несколько объектных файлов.
То есть когда у вас есть вызов некоторой функции, то компилятор лезет в библиотечный файл (не путать с заголовочным файлом, где находятся лишь объявления фукнц3ий), и в этом библиотечном файле ищет объектный модуль, содержащий объектный код функции.
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 18:45 #21
Abendstern, от параметров линковщика зависит, далеко не обязательно, что вырежет unused code, обычно отдельными параметрами и средствами задается
1
Байт
Эксперт C
16135 / 10413 / 1549
Регистрация: 24.12.2010
Сообщений: 19,713
06.11.2011, 18:45 #22
Nameless One, Увы, все зависит от произвола хозяина и настроек gcc. Мне приходилось работать на трех(всего-то) Линукс-хостах, и повсюду все по разному
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 18:53 #23
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1.c
int func_f(void)
{
    return 0;
}
 
int func_g(void)
{
    return 1;
}
 
int main()
{
    return func_f();
}
компилируем
Bash
1
gcc -c 1.c
линкуем
Bash
1
gcc 1.c -o a_1
видим, что в программе сохранились обе функции
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
alexxx@alexxx-laptop:~/c-test$ objdump -d a_1 | grep -C 5 func
 80483af:   ff d0                   call   *%eax
 80483b1:   c9                      leave  
 80483b2:   c3                      ret    
 80483b3:   90                      nop
 
080483b4 <func_f>:
 80483b4:   55                      push   %ebp
 80483b5:   89 e5                   mov    %esp,%ebp
 80483b7:   b8 00 00 00 00          mov    $0x0,%eax
 80483bc:   5d                      pop    %ebp
 80483bd:   c3                      ret    
 
080483be <func_g>:
 80483be:   55                      push   %ebp
 80483bf:   89 e5                   mov    %esp,%ebp
 80483c1:   b8 01 00 00 00          mov    $0x1,%eax
 80483c6:   5d                      pop    %ebp
 80483c7:   c3                      ret    
 
080483c8 <main>:
 80483c8:   55                      push   %ebp
 80483c9:   89 e5                   mov    %esp,%ebp
 80483cb:   e8 e4 ff ff ff          call   80483b4 <func_f>
 80483d0:   5d                      pop    %ebp
 80483d1:   c3                      ret    
 80483d2:   90                      nop
 80483d3:   90                      nop
другой вариант
компилируем
Bash
1
alexxx@alexxx-laptop:~/c-test$ gcc -c -fdata-sections -ffunction-sections 1.c
линкуем
Bash
1
alexxx@alexxx-laptop:~/c-test$ gcc -Wl,--gc-sections 1.o -o a_2
видим, что func_g была вырезана из бинарника
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
alexxx@alexxx-laptop:~/c-test$ objdump -d a_2 | grep -C 5 func
 8048388:   c7 04 24 1c 9f 04 08    movl   $0x8049f1c,(%esp)
 804838f:   ff d0                   call   *%eax
 8048391:   c9                      leave  
 8048392:   c3                      ret    
 
08048393 <func_f>:
 8048393:   55                      push   %ebp
 8048394:   89 e5                   mov    %esp,%ebp
 8048396:   b8 00 00 00 00          mov    $0x0,%eax
 804839b:   5d                      pop    %ebp
 804839c:   c3                      ret    
 
0804839d <main>:
 804839d:   55                      push   %ebp
 804839e:   89 e5                   mov    %esp,%ebp
 80483a0:   e8 ee ff ff ff          call   8048393 <func_f>
 80483a5:   5d                      pop    %ebp
 80483a6:   c3                      ret    
 80483a7:   90                      nop
 80483a8:   90                      nop
2
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 19:43  [ТС] #24
Цитата Сообщение от alex_x_x Посмотреть сообщение
от параметров линковщика зависит, далеко не обязательно, что вырежет unused code, обычно отдельными параметрами и средствами задается
Ага, вот теперь стало понятнее, спасибо за пример. Хотя как-то странно, почему по умолчанию не вырезается неиспользуемый код...

Не по теме:

Как вы, кстати, просматриваете такой дизассемблированный код (или как его правильно назвать)? Я тоже gcc использую, правда под виндовс. Хотел малость поэкспериментировать.

0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,273
Записей в блоге: 2
Завершенные тесты: 1
06.11.2011, 19:46 #25
Цитата Сообщение от Abendstern Посмотреть сообщение
Хотя как-то странно, почему по умолчанию не вырезается неиспользуемый код...
А почему он должен вырезаться? Программист писал, старался и было бы предательством со стороны компилятора взять и вырезать неиспользуемый код
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2011, 19:46
Привет! Вот еще темы с ответами:

Вопросы по C++ - C++
Всем привет! У меня появилось несколько вопросов по C++, был бы рад, если бы Вы помогли бы мне хотя бы из одним из них. 1) Как...

Вопросы по C++ - C++
Хочу учиться писать программы на C++, и у меня несколько вопросов 1) Этот язык такой же сложный, как Ассемблер? Например, Паскаль мне...

Вопросы - C++
Ребята, никто не писал никогда код на С++, связанный с имитационным моделированием? Просто, дали, там набор математич. формул и теория, а...

программирование вопросы - C++
Программирование С и С++ Здравствуйте товарищи программисты, очень нужна ваша помощь так как завтра экзамен.... а я решила первых три...


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

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

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