
- •1 Использование описания typedef
- •2 Преобразование типов
- •3 Указатели на функции
- •4 Пример использования указателей на функции
- •5 Области видимости и время жизни объектов
- •6 Пример использования статической локальной переменной
- •Примечание
- •7 Пространства имен
- •8 Заголовочные файлы
- •9 Подходы к разработке структуры программы
- •11 Задания на самостоятельную работу Задание 1
- •Задание 2
8 Заголовочные файлы
Организация программы в виде набора исходных файлов называется физической структурой программы.
Заголовочные файлы включаются в исходный текст с помощью директивы #include, после которой в угловых скобках обычно помещают имена стандартных заголовочных файлов, а в кавычках - имена заголовочных файлов разработанных пользователем. Например:
// Стандартный заголовочный файл:
#include <iostream>
// Заголовочный файл пользователя
#include "MyFile.h"
Различие заключается в порядке поиска файлов. Кавычки предполагают начало поиска с текущего каталога, а угловые скобки - поиск, начиная со специального каталога, определенного в конкретной среде программирования для стандартных заголовочных файлов. Заголовочные файлы могут содержать:
именованные пространства имен
определения типов
объявления и определения шаблонов
объявления имен
определения встроенных функций и констант
перечисления
директивы включения
макроопределения
директивы условной компиляции
комментарии.
Заголовочный файл не должен содержать
определений обычных функций и данных
неименованных пространств имен
экспортируемых определений шаблонов.
Для указания заголовочных файлов стандартной библиотеки не требуется расширение.
Каждый конкретный класс, перечисление, шаблон и т.д. должны быть определены в программе ровно один раз. "Правило одного определения" (One-Definition Rule) допускает наличие двух определений класса, шаблона или встроенной функции для определения одной и той же сущности, если они находятся в различных единицах трансляции, идентичны лексема за лексемой и значение лексем идентично в обеих единицах трансляции.
Для предотвращения повторной перекомпиляции заголовочного файла используются "стражи включения" (include guards):
// some_file.h
#ifndef Some_file_h
#define Some_file_h
// текст заголовочного файла
#endif
9 Подходы к разработке структуры программы
Программа является набором отдельных единиц компиляции, объединяемых компоновщиком. Нелокальные переменные инициализируются до вызова функции main(). Завершение программы происходит при выходе из main(), при вызове exit() или abort(). Определенный порядок инициализации глобальных переменных, расположенных в разных единицах трансляции, не гарантируется.
Есть два подхода к разработке структуры программы на языке С++.
Первый подход заключается в том, что функции и определения данных размещаются в нескольких исходных файлах, а типы, необходимые для их взаимодействия - в один заголовочный файл, который включается во все остальные файлы. Если отдельные части программы относительно независимы и могут быть использованы отдельно, то такой подход применять нецелесообразно
Другой подход заключается в том, что каждая часть программы имеет свой заголовочный файл, в котором используются предоставляемые этой частью средства. Тогда каждый .срр файл включает свой собственный .h файл (где объявлено то, что в этом .cpp файле определяется) и, возможно, некоторые другие .h файлы (где объявлено то, что ему нужно). При таком стиле использования заголовочных файлов .h файл и связанный с ним .cpp файл можно рассматривать как отдельный модуль. Такое построение программы позволяет разбить программу на независимые части. Если какая-либо часть использует средства, предоставляемые другой частью, то это указывается явно с помощью #include.
Если какую-либо функцию или переменную описать как static, то она будет известна только в пределах модуля.
10 Создание в MS Visual C++.NET программ, состоящих из нескольких единиц трансляции
Для добавления нового заголовочного файла в ранее созданный проект необходимо:
в подменю "Project" главного меню выбрать "Add New Item";
на панели "Templates" окна "Add New Item" выбрать тип файла Header File (.h); нужно указать имя нового файла (без расширения) в строке "Name";
нажать "OK", после чего открывается новый пустой файл.
Добавление нового файла с исходным текстом происходит аналогично: выбирается тип файла C++ File на закладке Files. В созданном новом файле целесообразно разместить директиву #include для подключения созданного ранее заголовочного файла.
Заголовочный файл и файл реализации целесообразно добавлять парами и давать им одинаковые имена (и различные расширения - .h и .cpp). Допустим, создается модуль состоящий из заголовочного файла SomeFile.h и файла реализации SomeFile.cpp.
В исходный текст заголовочного файла SomeFile.h нужно добавить "стражей включения"
#ifndef SomeFile_h
#define SomeFile_h
#endif
В заголовочном файле (перед #endif) следует разместить объявление функции (например функции sum()):
#ifndef SomeFile_h
#define SomeFile_h
int sum(int a, int b);
#endif
В файле реализации после #include "SomeFile.h" размещается определение функции.
#include "SomeFile.h"
int sum(int a, int b)
{
return a + b;
}
В главном модуле проекта необходимо подключить модуль SomeFile.h, а в функции main() осуществить ввод данных, вызов функции sum() и вывод результата:
// Программа вычисления суммы двух чисел
#include <iostream>
#include "SomeFile.h"
using namespace std;
int main(int argc, char* argv[])
{
int x, y;
cout << "Enter two integer values:" << endl;
cin >> x >> y;
int z = sum(x, y);
cout << "Sum is " << z << endl;
return 0;
}