Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2009 лекции ПЯВУ часть1.doc
Скачиваний:
22
Добавлен:
27.03.2015
Размер:
823.3 Кб
Скачать

Использование включаемых файлов

В языке С++ реализовано удобное решение. Можно поместить объявления классов и функций в отдельный файл и включать этот файл в начало других файлов с помощью оператора #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__– номер текущей строки в файле. Эти макроимена часто используют для печати отладочной информации.