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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что почитать? Посоветуйте http://www.cyberforum.ru/cpp-beginners/thread923578.html
Всем привет. Весь второй семестр учили в университете с++, и учась в универе я понял насколько огромные возможности предоставляет данный ЯП. Мы прошли структурное программирование и изучили...
C++ Полиморфизм В одной дешевой книжке про него пишут а в другой дорогой нет и понять я почему то немогу точно как и для чего он нужен http://www.cyberforum.ru/cpp-beginners/thread923565.html
C++ Подскажите, что я делаю не так
Вот задача: Написать программу, по длинам сторон распознающую среди всех треугольников АВС прямоугольные. Если таковых нету, то вычислить величину большего угла. Вот мой код. Подскажите, что я не...
C++ Класс без конструктора. Ошибка 1 неразрешенных внешних элементов
Добрый вечер. Помогите исправить ошибку. Пример у Страуструпа не работает. При компиляции появляется ошибка 1 неразрешенных внешних элементов class CZlib { public: // конструктор отсутствует...
C++ Не могу стартануть с WinApi http://www.cyberforum.ru/cpp-beginners/thread923523.html
Решил после изучения С++ освоить WinApi, он всетаки и к С# применим и ко всему угодно на сколько я понял. Но никак не могу понять как начать его изучать. Не могу найти код с окном, который можно бы...
C++ Ошибка в программе Я сейчас читаю книгу Липпмана "Язык программирования С++", так вот, там в конце 1 главы есть упражнение.Цитирую: "Напишите программу, которая запрашивает имя пользователя.Считайте ответ.Проверьте,... подробнее

Показать сообщение отдельно
ValeryS
Модератор
6653 / 5062 / 470
Регистрация: 14.02.2011
Сообщений: 16,926
17.07.2013, 08:34
Цитата Сообщение от Керра Посмотреть сообщение
программе.
Если это так, то я не понимаю, какой смысл выделять это в отдельный файл, если можно прописать то же самое в самом начале. Просто чтобы был отдельный список, и не надо было скакать вверх-вниз, если надо вспомнить какие параметры нужно передать в функцию?
видишь ли оно так и происходит
#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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru