Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
1

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

15.07.2013, 19:03. Показов 5534. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я читала учебник и википедию - никак не доходит.

В общем, может я неправильно поняла: есть у меня "Моя программа.cpp", и есть "Заголовочный файл.hpp". В заголовочном файле прописаны прототипы функций, и классы без определения их методов, этот заголовочный файл включается в мою программу. Все определения содержатся, собственно, в моей программе.
Если это так, то я не понимаю, какой смысл выделять это в отдельный файл, если можно прописать то же самое в самом начале. Просто чтобы был отдельный список, и не надо было скакать вверх-вниз, если надо вспомнить какие параметры нужно передать в функцию?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2013, 19:03
Ответы с готовыми решениями:

Про добавление заголовочных файлов в заголовочных файлах
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить...

Раздельная компиляция (нюансы использования заголовочных файлов и файлов реализации)
Почему во многих учебниках функции-члены класса внутри класса только объявляют, но определяют вне...

Подключение заголовочных файлов и файлов реализации
Здравствуйте,при создании класса в visual studio руками не компилится проект,при создании через add...

Подключение заголовочных файлов
Итересует меня вопрос : нужно ли при компиляции программ оставлять только нужные хэдеры ? т.е. их...

35
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,689
17.07.2013, 08:34 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Керра Посмотреть сообщение
программе.
Если это так, то я не понимаю, какой смысл выделять это в отдельный файл, если можно прописать то же самое в самом начале. Просто чтобы был отдельный список, и не надо было скакать вверх-вниз, если надо вспомнить какие параметры нужно передать в функцию?
видишь ли оно так и происходит
#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
несколько сумбурно получилось но надеюсь понятно
0
55 / 55 / 6
Регистрация: 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?
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
17.07.2013, 09:35 23
Цитата Сообщение от BigLow Посмотреть сообщение
как main.cpp ищет этот самый 1.cpp?
Компилируются они отдельно, да. А уже на этапе линковки связываются в исполняемый файл. Если вызываете компилятор и линковщик через командную строку, то там соответственно руками прописываете имена нужных файлов.
1
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,689
17.07.2013, 09:38 24
Цитата Сообщение от BigLow Посмотреть сообщение
как main.cpp ищет этот самый 1.cpp?
а никак не ищет
после работы компилятора образуются два объектных файла main.obj и 1.obj (расширение могут быть и другими)
и тут в дело в ступает линкер, он берет объектные файлы и создает из них что надо(исполняемый файл,библиотеку, файл прошивки) линкер знает какие файлы собирать в кучу, это зависит или от командной строки или от настроек среды написания(точнее среда создает командную строку для линкера)
объектные файлы может создавать не только компилятор Си но и другие компиляторы
например файл main.cpp обрабатывает компилятор Си и создает main.obj
а файл 1.asm обрабатывает компилятор ассемблера и создает 1.obj
линкер даже не будет знать что исходники написаны на разных языках, главное чтобы он понимал объектный файл
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 09:49 25
Цитата Сообщение от Schizorb Посмотреть сообщение
Если вызываете компилятор и линковщик через командную строку, то там соответственно руками прописываете имена нужных файлов.
у меня visual studio. и в сам проект просто добавляю нужные файлы. получается VS при компиляции автоматически устанавливает нужные связи?

Не по теме:

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

0
5499 / 4894 / 831
Регистрация: 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 потому что не поймешь как связываются файлы проекта, а я не послушался. теперь мучаюсь
И в чём мучения?
1
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,689
17.07.2013, 09:54 27
Цитата Сообщение от BigLow Посмотреть сообщение
меня visual studio. и в сам проект просто добавляю нужные файлы.
ключевое слово "в проект"
если ты просто создашь файл и бросишь в папку, то компилятор не будет знать что компилировать а линкер что прилинковывать
Цитата Сообщение от BigLow Посмотреть сообщение
говорили мне не использовать эту visual studio потому что не поймешь как связываются файлы проекта, а я не послушался. теперь мучаюсь
Я тоже на нем сижу и несколько не мучаюсь, просто нужно изучать инструмент а не тупо его использовать
или ты предпочитаешь вручную компилировать и ручками прописывать пути файлы и пр.
так visual studio тоже это позволяет, правда редко кто пользуется
1
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
17.07.2013, 10:00 28
BigLow, ну да, при использовании IDE это все автоматически происходит, для файлов, добавленных в проект. Хотя студийный компилятор можно и в консоли вызывать.

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

Не по теме:

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

1
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,689
17.07.2013, 10:05 29
Цитата Сообщение от Schizorb Посмотреть сообщение
Наверное в том, что трудно разобраться, что конкретно происходит при нажатии заветной кнопочки в IDE
так это про любую IDE можно сказать
у меня три среды VS,Keil, CodeVisionAVR и во всех есть " заветная кнопочка" ручками редко прописываю
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
17.07.2013, 10:13 30
Цитата Сообщение от ValeryS Посмотреть сообщение
так это про любую IDE можно сказать
Так я и говорю про любую. Но одно дело, когда вы уже понимаете, как все внутри устроено. Другое дело новичок, который хочет разобраться, а ему IDE предлагает - "нажми на кнопку - получишь результат". На этапе обучения все же ручками полезно писать.
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 10:19 31
Цитата Сообщение от Schizorb Посмотреть сообщение
"нажми на кнопку - получишь результат". На этапе обучения все же ручками полезно писать.
вот и я про то же самое. на кнопку нажал, а что там происходит - не понятно

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

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
ключевое слово "в проект"
если ты просто создашь файл и бросишь в папку, то компилятор не будет знать что компилировать а линкер что прилинковывать
спасибо
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2013, 10:21 32
Цитата Сообщение от BigLow Посмотреть сообщение
вот и я про то же самое. на кнопку нажал, а что там происходит - не понятно
Мучаться то зачем? Почитать можно или спросить, и конец мучениям. Информации полно. Не обязательно всё руками делать, чтобы иметь представление.
1
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,689
17.07.2013, 13:59 33
Цитата Сообщение от BigLow Посмотреть сообщение
да вот как раз с этим и мучения, что непонятно где же эта связь main.cpp <-> 1.cpp. хотя сейчас понемногу начинаю понимать, а то прямо какой то темный лес
когда ты добавляешь файлы в проект ( в VS это "обозреватель решений")
то этим ты даешь команду компилятору откомпилировать все файлы которые в проекте
и так же команду линкеру(он же компоновщик) собрать все объектные файлы что получились
если хочешь посмотреть что происходит то можешь запустить свойства проекта
и посмотреть в С/С++ "командная строка" какая командная строка передается компилятору
в вкладке компоновщик "командная строка" какая передается линкеру
можешь поменять настройки и посмотреть как будет меняться командная строка
там же можешь вручную набить командную строку, но не удивляйся если с первого раза ничего не получится
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 15:45 34
Цитата Сообщение от ValeryS Посмотреть сообщение
даешь команду компилятору откомпилировать все файлы которые в проекте
а компилируются только .cpp файлы, .h файлы не компилируются?

Не по теме:

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

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

Добавлено через 28 минут
Здесь можете почитать: Процесс компиляции
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
17.07.2013, 16:34 36
alsav22, большое спасибо за ссылку
0
17.07.2013, 16:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2013, 16:34
Помогаю со студенческими работами здесь

Подключение заголовочных файлов
Как работает подключение заголовчных файлов в Линукс во время компиляции? К примеру имею свой...

Подключение заголовочных файлов
Имею два файла Large Factorial.h #include &lt;sstream&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt;...

Подключение заголовочных файлов
Здравствуйте. Возникают ошибки при компиляции проекта: 1. Указывает на указатель: 2. Указывает...

Отличие заголовочных файлов
чем отличается string.h cstring string


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru