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

Назначение заголовочных файлов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.78
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
15.07.2013, 19:03     Назначение заголовочных файлов #1
Я читала учебник и википедию - никак не доходит.

В общем, может я неправильно поняла: есть у меня "Моя программа.cpp", и есть "Заголовочный файл.hpp". В заголовочном файле прописаны прототипы функций, и классы без определения их методов, этот заголовочный файл включается в мою программу. Все определения содержатся, собственно, в моей программе.
Если это так, то я не понимаю, какой смысл выделять это в отдельный файл, если можно прописать то же самое в самом начале. Просто чтобы был отдельный список, и не надо было скакать вверх-вниз, если надо вспомнить какие параметры нужно передать в функцию?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 19:03     Назначение заголовочных файлов
Посмотрите здесь:

C++ Подключение заголовочных файлов
Отличие заголовочных файлов C++
Подключение заголовочных файлов C++
C++ Объявление заголовочных файлов
Включение заголовочных файлов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
17.07.2013, 08:34     Назначение заголовочных файлов #21
Цитата Сообщение от Керра Посмотреть сообщение
программе.
Если это так, то я не понимаю, какой смысл выделять это в отдельный файл, если можно прописать то же самое в самом начале. Просто чтобы был отдельный список, и не надо было скакать вверх-вниз, если надо вспомнить какие параметры нужно передать в функцию?
видишь ли оно так и происходит
#include дает команду препроцессору вставить в файл все что находится в другом файле
препроцессор это такая штука которая работает еще до компилятора

например есть файлы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// file1.h
 
int fnc_file1(void);// объявление ;
 
..........................
 
// file1.c
#include "file1.h"
int fnc_file1(void)  // определение
{
 return 2;
}
 
.........................................
// file2.c
#include "file1.h"
int  a=fnc_file1();//использование
они после препроцессора превратятся
в
C++
1
2
3
4
5
6
7
8
9
10
11
12
// file1.c
int fnc_file1(void); // объявление
int fnc_file1(void)  //определение
{
 return 2;
}
 
.........................................
// file2.c
 
int fnc_file1(void); // объявление
int  a=fnc_file1();// использование
можешь так же ручками написать, никто ругать не станет
а если нужно использовать 100 функций ??? все 100 прописывать
вот и разбили на файлы, заголовков и реализации
следующий уровень использования
ктото уже скомпилировал file1 создал из него библиотеку, но как её использовать если не знаем что за функции в ней и как они выглядят?
вот и нужен заголовочный файл

простейший пример window.h где реализованы функции программист может и не знать а заголовочный файл вот он

теперь о #pragma once
говорит что два раза не надо включать заголовочный файл
например если напишем так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// file1.h
 
int fnc_file1(void); // объявление
 
..........................
 
// file1.c
#include "file1.h"
int fnc_file1(void)  // определение
{
 return 2;
}
 
.........................................
// file2.c
#include "file1.h"
#include "file1.h"
int  a=fnc_file1();//использование
после препроцессора превратится в

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// file1.c
int fnc_file1(void);// 
int fnc_file1(void)
{
 return 2;
}
 
.........................................
// file2.c
 
int fnc_file1(void); // Два объявления!!!!
int fnc_file1(void);
int  a=fnc_file1();

конечно никто в здравом уме так писать не будет, но есть неявное подключение

например
C++
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
29
30
31
// file1.h
 
int fnc_file1(void);// объявление ;
 
..........................
 
// file3.h
#include "file1.h"
 int fnc_file3(void);// объявление ;
 
..........................
 
// file1.c
#include "file1.h"
int fnc_file1(void)  // определение
{
 return 2;
}
 
// file3.c
#include "file3.h"
int fnc_file3(void)  // определение
{
 return 5;
}
.........................................
// file2.c
#include "file1.h"
#include "file3.h" 
int  a=fnc_file1();//использование
int  b=fnc_file3();
они после препроцессора превратятся в
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// file1.c
int fnc_file1(void); // объявление
int fnc_file1(void)  //определение
{
 return 2;
}
 
// file3.c
int fnc_file1(void); // объявление придет из  file3.h   #include "file1.h"
int fnc_file3(void) ;
int fnc_file3(void)  // определение
{
 return 2;
}
 
 
.........................................
// file2.c
 
int fnc_file1(void);
int fnc_file1(void); // объявление придет из  file3.h   #include "file1.h"
int fnc_file3(void) ;
int  a=fnc_file1();// использование


для таких случаев и служит #pragma once
C++
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
29
30
31
// file1.h
#pragma once 
int fnc_file1(void);// объявление ;
 
..........................
 
// file3.h
#include "file1.h"
 int fnc_file3(void);// объявление ;
 
..........................
 
// file1.c
#include "file1.h"
int fnc_file1(void)  // определение
{
 return 2;
}
 
// file3.c
#include "file3.h"
int fnc_file3(void)  // определение
{
 return 2;
}
.........................................
// file2.c
#include "file1.h"
#include "file3.h" 
int  a=fnc_file1();//использование
int  b=fnc_file3();
они после препроцессора превратятся в
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// file1.c
int fnc_file1(void); // объявление
int fnc_file1(void)  //определение
{
 return 2;
}
 
// file3.c
int fnc_file1(void); // объявление придет из  file3.h   #include "file1.h"
int fnc_file3(void) ;
int fnc_file3(void)  // определение
{
 return 5;
}
 
 
.........................................
// file2.c
 
int fnc_file1(void);
//int fnc_file1(void); // объявление из  file3.h   #include "file1.h" не придет сработает #pragma once 
int fnc_file3(void) ;
int  a=fnc_file1();// использование
для этих же случаев служит Include guard
это конструкция типа
C++
1
2
3
4
 #ifndef MACRO1 //  если макрос определен то пропускаем все до #endif
 #define MACRO1 // иначе определим макрос 
 .........   // и чтото делаем
 #endif
вот пара ссылок
http://ru.wikipedia.org/wiki/Pragma_once
http://ru.wikipedia.org/wiki/Include_guard
несколько сумбурно получилось но надеюсь понятно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 09:23     Назначение заголовочных файлов #22
у меня есть вопрос по этой теме.
предположим есть проект в котором 3 файла: main.cpp, 1.h. и 1.cpp.
в main.cpp мы пишем #include "1.h", в 1.cpp пишем #include "1.h". т.е. main.cpp использует 1.h и 1.cpp тоже использует 1.h
но связь между main.cpp и 1.cpp как таковой нет!

как main.cpp ищет этот самый 1.cpp?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
17.07.2013, 09:35     Назначение заголовочных файлов #23
Цитата Сообщение от BigLow Посмотреть сообщение
как main.cpp ищет этот самый 1.cpp?
Компилируются они отдельно, да. А уже на этапе линковки связываются в исполняемый файл. Если вызываете компилятор и линковщик через командную строку, то там соответственно руками прописываете имена нужных файлов.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
17.07.2013, 09:38     Назначение заголовочных файлов #24
Цитата Сообщение от BigLow Посмотреть сообщение
как main.cpp ищет этот самый 1.cpp?
а никак не ищет
после работы компилятора образуются два объектных файла main.obj и 1.obj (расширение могут быть и другими)
и тут в дело в ступает линкер, он берет объектные файлы и создает из них что надо(исполняемый файл,библиотеку, файл прошивки) линкер знает какие файлы собирать в кучу, это зависит или от командной строки или от настроек среды написания(точнее среда создает командную строку для линкера)
объектные файлы может создавать не только компилятор Си но и другие компиляторы
например файл main.cpp обрабатывает компилятор Си и создает main.obj
а файл 1.asm обрабатывает компилятор ассемблера и создает 1.obj
линкер даже не будет знать что исходники написаны на разных языках, главное чтобы он понимал объектный файл
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 09:49     Назначение заголовочных файлов #25
Цитата Сообщение от Schizorb Посмотреть сообщение
Если вызываете компилятор и линковщик через командную строку, то там соответственно руками прописываете имена нужных файлов.
у меня visual studio. и в сам проект просто добавляю нужные файлы. получается VS при компиляции автоматически устанавливает нужные связи?

Не по теме:

говорили мне не использовать эту visual studio потому что не поймешь как связываются файлы проекта, а я не послушался. теперь мучаюсь

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2013, 09:54     Назначение заголовочных файлов #26
Цитата Сообщение от BigLow Посмотреть сообщение
как main.cpp ищет этот самый 1.cpp?
Зачем ему его искать? Файлы друг друга не ищут. Для компилятора, который видит в единицу времени один файл, видеть другие файлы не нужно. Он скомпилирует, по отдельности, в объектные файлы, все .cpp файлы (с включёнными в них .h файлами), которые есть в проекте (это в IDE). Из двух .cpp и одного .h он сделает два объектных файла, с которыми дальше будет работать компоновщик. Вот он уже видит, в каждый момент времени, все собранные компилятором объектные файлы.

Добавлено через 1 минуту
Цитата Сообщение от BigLow Посмотреть сообщение
Не по теме:
говорили мне не использовать эту visual studio потому что не поймешь как связываются файлы проекта, а я не послушался. теперь мучаюсь
И в чём мучения?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
17.07.2013, 09:54     Назначение заголовочных файлов #27
Цитата Сообщение от BigLow Посмотреть сообщение
меня visual studio. и в сам проект просто добавляю нужные файлы.
ключевое слово "в проект"
если ты просто создашь файл и бросишь в папку, то компилятор не будет знать что компилировать а линкер что прилинковывать
Цитата Сообщение от BigLow Посмотреть сообщение
говорили мне не использовать эту visual studio потому что не поймешь как связываются файлы проекта, а я не послушался. теперь мучаюсь
Я тоже на нем сижу и несколько не мучаюсь, просто нужно изучать инструмент а не тупо его использовать
или ты предпочитаешь вручную компилировать и ручками прописывать пути файлы и пр.
так visual studio тоже это позволяет, правда редко кто пользуется
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
17.07.2013, 10:00     Назначение заголовочных файлов #28
BigLow, ну да, при использовании IDE это все автоматически происходит, для файлов, добавленных в проект. Хотя студийный компилятор можно и в консоли вызывать.

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
И в чём мучения?
Наверное в том, что трудно разобраться, что конкретно происходит при нажатии заветной кнопочки в IDE

ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
17.07.2013, 10:05     Назначение заголовочных файлов #29
Цитата Сообщение от Schizorb Посмотреть сообщение
Наверное в том, что трудно разобраться, что конкретно происходит при нажатии заветной кнопочки в IDE
так это про любую IDE можно сказать
у меня три среды VS,Keil, CodeVisionAVR и во всех есть " заветная кнопочка" ручками редко прописываю
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
17.07.2013, 10:13     Назначение заголовочных файлов #30
Цитата Сообщение от ValeryS Посмотреть сообщение
так это про любую IDE можно сказать
Так я и говорю про любую. Но одно дело, когда вы уже понимаете, как все внутри устроено. Другое дело новичок, который хочет разобраться, а ему IDE предлагает - "нажми на кнопку - получишь результат". На этапе обучения все же ручками полезно писать.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 10:19     Назначение заголовочных файлов #31
Цитата Сообщение от Schizorb Посмотреть сообщение
"нажми на кнопку - получишь результат". На этапе обучения все же ручками полезно писать.
вот и я про то же самое. на кнопку нажал, а что там происходит - не понятно

Цитата Сообщение от alsav22 Посмотреть сообщение
И в чём мучения?
да вот как раз с этим и мучения, что непонятно где же эта связь main.cpp <-> 1.cpp. хотя сейчас понемногу начинаю понимать, а то прямо какой то темный лес

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
ключевое слово "в проект"
если ты просто создашь файл и бросишь в папку, то компилятор не будет знать что компилировать а линкер что прилинковывать
спасибо
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2013, 10:21     Назначение заголовочных файлов #32
Цитата Сообщение от BigLow Посмотреть сообщение
вот и я про то же самое. на кнопку нажал, а что там происходит - не понятно
Мучаться то зачем? Почитать можно или спросить, и конец мучениям. Информации полно. Не обязательно всё руками делать, чтобы иметь представление.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
17.07.2013, 13:59     Назначение заголовочных файлов #33
Цитата Сообщение от BigLow Посмотреть сообщение
да вот как раз с этим и мучения, что непонятно где же эта связь main.cpp <-> 1.cpp. хотя сейчас понемногу начинаю понимать, а то прямо какой то темный лес
когда ты добавляешь файлы в проект ( в VS это "обозреватель решений")
то этим ты даешь команду компилятору откомпилировать все файлы которые в проекте
и так же команду линкеру(он же компоновщик) собрать все объектные файлы что получились
если хочешь посмотреть что происходит то можешь запустить свойства проекта
и посмотреть в С/С++ "командная строка" какая командная строка передается компилятору
в вкладке компоновщик "командная строка" какая передается линкеру
можешь поменять настройки и посмотреть как будет меняться командная строка
там же можешь вручную набить командную строку, но не удивляйся если с первого раза ничего не получится
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 15:45     Назначение заголовочных файлов #34
Цитата Сообщение от ValeryS Посмотреть сообщение
даешь команду компилятору откомпилировать все файлы которые в проекте
а компилируются только .cpp файлы, .h файлы не компилируются?

Не по теме:

простите за глупые вопросы

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2013, 16:18     Назначение заголовочных файлов #35
Цитата Сообщение от BigLow Посмотреть сообщение
а компилируются только .cpp файлы, .h файлы не компилируются?
Отдельно нет. Их текст, перед компиляцией, вставляется в файл .cpp вместо #include "name.h", и всё вместе уже компилируется.

Добавлено через 28 минут
Здесь можете почитать: Процесс компиляции
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2013, 16:34     Назначение заголовочных файлов
Еще ссылки по теме:

Подключение заголовочных файлов C++
Подключение заголовочных файлов C++
Иерархия заголовочных файлов C++

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

Или воспользуйтесь поиском по форуму:
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 16:34     Назначение заголовочных файлов #36
alsav22, большое спасибо за ссылку
Yandex
Объявления
17.07.2013, 16:34     Назначение заголовочных файлов
Ответ Создать тему
Опции темы

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