- •Оглавление
- •1.2. Свойства языков программирования
- •1.3. Основные парадигмы программирования Процедурное программирование
- •Модульное программирование
- •Абстракция данных
- •Объектно-ориентированное программирование
- •Непечатные символы
- •Тема 2 Типы данных
- •2.1. Понятие переменной и объявление переменных
- •Объявление переменных
- •Встроенные типы данных
- •Размер памяти, выделяемой под встроенные типы данных
- •2.2. Константы и перечисления Константные переменные
- •Перечисления
- •2.3. Операции и выражения
- •Мультипликативные операции
- •Операции сравнения
- •Побитовые логические операции
- •Побитовые операции
- •Комментарии
- •Оператор while(пока)
- •Оператор do/while(выполнять/пока)
- •Оператор for(цикл)
- •Оператор множественного выбора switch
- •Операторы breakиcontinue
- •Тема 4 Массивы
- •4.1.Определение, объявление и инициализация массивов
- •Объявления и инициализация массивов в программе
- •4.2. Сортировка массивов Пузырьковая сортировка
- •Сортировка вставками
- •4.3. Поиск в массивах Линейный поиск
- •Двоичный поиск
- •4.4. Многомерные массивы
- •Тема 5 Указатели Объявления и инициализация переменных указателей
- •5.1. Операции над указателями
- •5.2. Выражения и арифметические действия с указателями
- •5.3. Взаимосвязи между указателями и массивами
- •5.4. Массивы указателей
- •5.5. Динамическое выделение памяти под массивы
- •Тема 6 Функции
- •6.2. Определения функций
- •Генерация случайных чисел
- •6.3. Классы памяти и область действия Классы памяти
- •Область действия
- •6.4. Рекурсия
- •6.5. Ссылки и ссылочные параметры
- •Вызов функций по ссылке с аргументами указателями
- •6.6. Использование спецификатораconstс указателями
- •6.7. Перегрузка функций
- •Аргументы по умолчанию
- •6.8. Передача массивов в функции
- •6.9. Указатель на функцию
- •6.10. Командная строка аргументов
- •6.11 Неопределенное количество аргументов
- •Тема 7 Введение в обработку строк
- •7.1. Работа со строками в с
- •Понятие символов и строк в с
- •Функции для работы со строками
- •Определение длины строки
- •Сложение двух строк (конкатенация)
- •Добавление к исходной строке указанного количества символов.
- •Копирование строки в другую строку
- •Сравнение строк
- •Получение строки от пользователя
- •Тема 8 Работа с файлами
- •Открытие файла
- •Чтение из файла символа или строки символов
- •Запись символа или строки символов в файл
- •Смещение внутри файла
- •Значения параметра fromwhereфункцииfseek
- •Закрытие файла
- •Тема 9 Компоновка программ и препроцессор
- •9.1. Компоновка программ
- •Проблема использования общих функций и имен
- •Использование включаемых файлов
- •9.2. Препроцессор
- •Определение макросов
- •Условная компиляция
- •Дополнительные директивы препроцессора
- •Тема 10 Структуры
- •10.1. Определение структур и доступ к элементам
- •Доступ к элементам структур
- •Использование структур
- •10.2. Битовые поля
- •10.3. Объединения
- •10.4. Построение связных списков на основе структур с самоадресацией
- •Создание простого связного списка
- •Очереди
- •Деревья
- •Список рекомендуемой литературы
Использование включаемых файлов
В языке С++ реализовано удобное решение. Можно поместить объявления классов и функций в отдельный файл и включать этот файл в начало других файлов с помощью оператора #include.
#include "function.h"
Фактически оператор #includeподставляет содержимое файлаfunction.hв текущий файл перед тем, как начать его компиляцию. Эта подстановка осуществляется во время первого прохода компилятора по программе – препроцессора. Файлfunction.hназывается файлом заголовков.
В такой же файл заголовков можно поместить объявления классов и включать его в другие файлы, там, где создаются объекты этих классов.
Таким образом, текст программы на языке С++ помещается в файлы двух типов – файлы заголовковифайлы программ. В большинстве случаев имеет смысл каждый класс помещать в отдельный файл, вернее, два файла – файл заголовков для объявления класса и файл программ для определения класса. Имя файла обычно состоит из имени класса. Для файла заголовков к нему добавляется окончание".h"(иногда, особенно в системе Unix,".hh"или".H"). Имя файла программы – опять-таки имя класса с окончанием".cpp"(иногда".cc"или".C").
Включение файлов может быть вложенным, т.е. файл заголовков может сам использовать оператор #include. Текст файлаfunction.hпоказан на рис. 9.4.
#ifndef __FUNCTION_H__
#define __FUNCTION_H__
// Включить файл стандартной библиотеки
#include <string.h>
int f1(int);
void f2(char*, char*);
#endif
Рис. 9.4. Заголовочный файлfunction.h
Необходимо обратить внимание на первые две и последнюю строки этого файла. Оператор #ifndefначинает блок так называемой условной компиляции, который заканчивается оператором#endif. Блок условной компиляции – это кусок текста, который будет компилироваться, только если выполнено определенное условие. В данном случае условие заключается в том, что символ__FUNCTION_H__не определен. Если этот символ определен, текст между#ifndefи#endifне будет включен в программу. Первым оператором в блоке условной компиляции стоит оператор#define, который определяет символ__FUNCTION_H__как пустую строку.
Компилятор поставляется с набором файлов заголовков, которые описывают все стандартные функции и классы. При включении стандартных файлов обычно используют немного другой синтаксис:
#include <string.h>
9.2. Препроцессор
В языке С++ имеется несколько операторов, которые начинаются со знака #:#include, #define, #undef, #ifdef, #else, #if, #pragma. Все они обрабатываются так называемымпрепроцессором.
Иногда препроцессор называют макропроцессором, поскольку в нем определяются макросы. Директивы препроцессора начинаются со знака #, который должен быть первым символом в строке после пробелов.
Определение макросов
Форма директивы #define
#define имя определение
определяет макроимя. Везде, где в исходном файле встречается это имя, оно будет заменено его определением. Например, текст:
#define NAME "database"
Connect(NAME);
после препроцессора будет заменен на
Connect("database");
По умолчанию имя определяется как пустая строка, т.е. после директивы
#define XYZ
макроимя XYZсчитается определенным со значением – пустой строкой.
Другая форма #define
#define имя ( список_имен ) определение
определяет макрос – текстовую подстановку с аргументами
#define max(X, Y) ((X > Y) ? X : Y)
Текст max(5, a)будет заменен на
((5 > a) ? 5 : a)
В большинстве случаев использование макросов (как с аргументами, так и без) в языке С++ является признаком непродуманного дизайна [16]. В языке С макросы были действительно важны, и без них было сложно обойтись. В С++ при наличии констант и шаблонов макросы не нужны. Макросы осуществляют текстовую подстановку, поэтому они в принципе не могут осуществлять никакого контроля использования типов. В отличие от них в шаблонах контроль типов полностью сохранен. Кроме того, возможности текстовой подстановки существенно меньше, чем возможности генерации шаблонов.
Директива #undefотменяет определение имени, после нее имя перестает быть определенным.
У препроцессора есть несколько макроимен, которые он определяет сам, их называют предопределенными именами. У разных компиляторов набор этих имен различен, но два определены всегда: __FILE__ и__LINE__. Значением макроимени__FILE__является имя текущего исходного файла, заключенное в кавычки. Значением__LINE__– номер текущей строки в файле. Эти макроимена часто используют для печати отладочной информации.