Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Концепция решения информационных задач.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
583.68 Кб
Скачать

2.5.1. Комментарии

При создании программного продукта разработчик всегда ясно представляет, что будет выполнять та или иная часть программы. Однако, если программа довольно сложная, через какое-то время бывает трудно вспомнить всю цепь логических рассуждений, предшествовавших написанию программы. Особенно сложно бывает разобраться в текстах программ других разработчиков.

Чтобы избежать подобных неприятностей, в процессе составления программного кода используются так называемые комментарии. Тест комментариев всегда игнорируется компилятором, но позволяет программисту описывать назначение программы или какой-либо её части.

В С++ используется две разновидности комментариев.

Первый, традиционный (заимствованный из С) многострочный комментарий, представляет собой блок, начинающийся с последовательности символов 'слеш со звёздочкой' (/*) и заканчивается символами 'звёздочка слеш' (*/). Как следует из названия, данный вид комментария может располагаться на нескольких строках. Комментарии этого вида не могут быть вложенными друг в друга.

Второй вид – однострочный комментарий – следует за 'двойным слешем' (//) до конца текущей строки. Этот тип комментария может быть вложенным в многострочный комментарий и используется только в языке С++.

Кроме пояснений текста программы комментарии можно использовать для временного исключения из программы некоторой её части. Этот приём обычно используется при отладке.

Например:

// примеры комментария

int a=0; // int d;

/* int b=15 */

int c=7;

/* <– начало комментария

a=c;

конец комментария ->*/

В приведённом примере компилятор проигнорирует объявление переменных b и d, а также присвоение переменной а значения переменной с.

2.5.2. Директивы препроцессора

Препроцессор – специализированная программа предназначенная для первичной (до компиляции) обработки файлов исходных модулей программ С/С++. Использование препроцессора позволяет облегчить написание программ, делает их мобильными, легко читаемыми и удобными для отладки.

Директивы препроцессора – команды, предписывающие препроцессору выполнения тех или иных действий.

Все директивы начинаются с символа #. Перед начальным символом # и вслед за ним могут располагаться пробелы.

Директива #include позволяет включить в текст файла с искомым кодом текст, содержащийся в другом файле. Синтаксис её использования следующий:

#include <header_name>

#include "header_name"

#include macro_identifier

Здесь header_name должно быть именем файла с расширением. Традиционно используется расширение h или hpp. Кроме того, в header_name может указываться путь к файлу. Препроцессор удаляет директиву #include из текста файла с исходным кодом и направляет содержимое указанного в ней файла для обработки компилятором. Если указан путь к файлу, компилятор ищет его в указанном каталоге. Первая и вторая форма синтаксиса различаются используемым компилятором алгоритмом поиска файла, если полный путь к нему не задан. Форма <header_name>, в которой имя заголовочного файла задаётся в угловых скобках, указывает компилятору, что заголовочный файл следует искать в подкаталоге \INCLUDE компилятора. Форма "header_name", в которой имя заголовочного файла задаётся в кавычках, указывает, что заголовочный файл следует искать в текущем каталоге, затем – в подкаталоге \INCLUDE компилятора. Если препроцессор не обнаружит указанный в директиве файл, выдаётся сообщение об ошибке. Количество файлов, подлежащих включению в программу, не ограничено.

В третьей версии предполагается, что существует макроопределение, которое раскрывается в допустимое имя заголовочного файла.

Основные включаемые файлы:

stdio.h – файл, содержащий описание функций стандартного

ввода-вывода С/С++. В частности функций

scanf – форматный ввод-вывод с клавиатуры;

printf – форматный вывод на экран;

conio.h – файл, содержащий описание функций ввода-вывода

для консоли и порта С/С++. К ним относятся:

getch – ввод с клавиатуры одиночного символа;

clrscr – функция очистки экрана;

iostream.h – файл, содержащий описание операций потокового

ввода-вывода С++;

math.h – файл, содержащий описание стандартных

математических функций С/С++.

Директива #define позволяет определить некоторый идентификатор, а так же связать его с последовательностью символов, представляющих собой некоторую конструкцию (лексему) языка С/С++. В последнем случае он служит для определения макроса.

Рассмотрим сначала вариант использования директивы #define для определения некоторого идентификатора или символической константы. Например, директива

#define DEBUG

определяет идентификатор DEBUG. После того, как идентификатор определён в данном файле, он может быть использован в других директивах препроцессора. Отменить определение идентификатора можно с помощью директивы #undef. Например:

#undef DEBUG

Директива #ifdef позволяет проверить, определена ли символическая константа и, если – да, следующие за ней строки будут направлены для обработки компилятором. Она относится к так называемым условным директивам, поскольку проверяет выполнение некоторого условия и в зависимости от результата проверки изменяет процесс компиляции. Используемая совместно с данной (и другими условными директивами), директива #endif сообщает препроцессору о конце условного блока кода.

Приведём пример использования этих директив:

#ifdef DEBUG

//Какая-то часть исходного кода,

//которая должна выполняться в отладочной

//версии программы

#endif

Сходной с директивой #ifdef является директива #ifndef. Эта директива также поверяет существование указанного в ней идентификатора, однако следующие за ней строки передаются компилятору, если этот идентификатор не определён.

Приведём пример её использования:

#ifndef WINVER

#define WINVER 0x400

#endif

Часто директива используется при необходимости замены поименованной величины, её конкретным значением. Например, директива

#define PI 3.1416

предписывает замену в тексте программы идентификатора PI последовательностью символов: 3.1416, которая при обработке будет определена компилятором как числовая константа.

Макросы

Макрос – это фрагмент кода, который выглядит и работает так же, как функция. Однако функцией он не является. Имеется несколько различий между макросами и функциями:

  • макрос заменяется своим определением во время работы препроцессора, т. е. ещё до компиляции программы. Поэтому макросы не вызывают дополнительных затрат времени, как при вызове функции;

  • использование макросов приводит к разрастанию исходного кода и увеличению размера исполняемой программы. Функции являются в некотором смысле антиподом макросов. Код, который они представляют, встраивается в программу только один раз, что приводит к сокращению кода программы. С другой стороны, при выполнении программы требуется дополнительное время для организации вызова функции;

  • компилятор не выполняет никаких проверок типов в макросе. Поэтому при передаче макросу аргумента, не соответствующего подразумеваемому типу, или неверного числа аргументов, никаких сообщений об ошибке не будет;

  • поскольку макрос является средством для встраивания фрагмента кода, не существует единого адреса, связанного с ним. Поэтому нельзя определить указатель на макрос или использовать его адрес.

Для определения макросов используется директива

#define. Как и функция макросы могут иметь параметры. Например,

#define MULTIPLY(x,y) ((x)*(y))

В этом случае фрагмент кода

int a=2,b=3;

int c= MULTIPLY(a,b);

будет заменён кодом

int a=2,b=3;

int c= ((a)*(b));

Внешне использование макроса похоже не использование функции (из-за чего их иногда называют псевдофункциями). Поскольку, как отмечено выше, это всё-таки разные объекты, принято имена макросов записывать прописными буквами. Кроме того, рекомендуется в макроопределении заключать в скобки всё тело макроса и каждый из его параметров. Если определение макроса не умещается на одной строке, оно может быть продолжено в последующих строках. Для продолжения макроопределения в следующей строке достаточно в конце текущей строки поставить знак '\'. Макрос может быть аннулирован в любом месте программы с помощью директивы #undef.