Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Программа 24. Возможности препроцессора

Приводимая далее программа дает образцы использования различных директив препроцессора.

// Файл Preproc.cpp.

// Демонстрация работы директив препроцессора

#include <iostream.h>

#include <conio.h>

/* greater_than(a,b) - макрос с параметрами, проверяющий, больше ли первый аргумент второго? Аргументы в определении макроса следует заключать в скобки во избежание ошибок */

#define greater_than(a,b) ((a) > (b) ? 1 : 0)

#define SMALL // SMALL - пустой макрос

void main()

{

int c = 5, d = 7;

if(greater_than(c, d))

cout << "\nc больше d";

else

cout << "\nc меньше d";

#ifdef SMALL // Использование директивы ifdef

cout << "\nМакрос SMALL определен";

#else

cout << "\nМакрос SMALL не определен";

#endif

#undef SMALL // Отмена определения макроса SMALL

#ifndef SMALL // Использование директивы ifndef

cout << "\nМакрос SMALL не определен";

#else

cout << "\nМакрос SMALL определен";

#endif

cout << "\nИмя текущего файла " << __FILE__;

cout << "\nДата " << __DATE__; // Использование

cout << "\nНомеp текущей строки "<<__LINE__; // встроенных

cout << "\nВремя " << __TIME__; // макросов

#define PROBLEM 0 // Определение макроса PROBLEM

#if PROBLEM // Проверка значения макроса PROBLEM

#error We have a problem // Сюда не попадаем, если PROBLEM равно 0

#endif

getch();

}

В результате работы данной программы на экране появилось следующее:

c меньше d

Макрос SMALL определен

Макрос SMALL не определен

Имя текущего файла PREPROC.CPP

Дата Jul 01 2004

Номер текущей строки 36

Время 14:59:12

Если дать макросу PROBLEM значение, отличное от 0, например:

#define PROBLEM 1

то компиляция прервется на строке:

#error We have a problem

с выдачей сообщения: We have a problem.

Так как препроцессор изменяет текст исходной программы, причем измененный текст, как правило, недоступен, ошибки, связанные с макросами, бывает трудно найти, поэтому, по возможности следует избегать чрезмерного использования макросов, особенно макросов с параметрами. Вместо макросов с параметрами следует использовать функции.

Задачи 122-124. Макросы

Макрос – это имя, которому директива препроцессора #define задает некоторое значение. В тексте программы каждое вхождение имени заменяется заданным значением.

  1. Напишите макрос, вычисляющий максимальное значение двух величин и программу с его использованием.

  2. Напишите макрос, вычисляющий минимальное значение двух величин и программу с его использованием.

  3. Напишите макрос для округления числа с плавающей точкой до ближайшего целого. Результат округления должен иметь целый тип. Напишите программу, использующую этот макрос.

Глава 10.Указатели и ссылки

10.1.Указатели и адреса

В языке C++ можно определять переменные, значениями которых являются адреса других переменных. Такие переменные называются указателями. Для объявления указателя после имени типа ставится *, например,

char *p; // p – указатель на переменную типа char

Существует унарный оператор &, выдающий адрес своего операнда. После выполнения инструкций:

char c = ’0’;

p = &c;

у казатель p будет содержать адрес переменной c (говорят, что p ссылается на c). Схема расположения в памяти переменной c и указателя p, содержащего ее адрес, показана на рис.34. Символьная переменная c занимает один байт памяти, а указатель p – четыре. Такое количество памяти выделяется под указатели на 32 –разрядных компьютерах, в которых для формирования адресов используется 4 байта, состоящих из 8 двоичных разрядов – битов.

Рис.35. Связь объекта и указателя на него

К указателю можно применять унарный оператор *, возвращаюший объект, на который ссылается данный указатель, например,

*p = ’A’; // Теперь c = ’A’

Иначе говоря, если p указывает на c, то *p и c – это одно и то же.

Можно создавать указатели на величины любых типов.