Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

11.3. Директивы препроцессора #define и #undef

11.3.1. Символические константы

Директива препроцессора #define создает символические константы или макросы без параметров, обозначаемые идентификаторами, и макросы – операции, обозначаемые символьными строками. Формат директивы препроцессора #define при объявлении символической константы:

#define идентификатор_константы замещающий_текст

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

#define PI 3.14159

все последующие вхождения в текст программы символической константы PI будут заменены на численную константу 3.14159. Замена идентификатора константы не производится в комментариях и строках символов. Если замещающий текст в директиве не задан, то во всем тексте идентификаторы константы просто стираются. После замены всех символических констант их значениями исходный текст программы опять просматривается препроцессором в поисках необходимости новых замен. Таким образом, можно использовать вложенные определения символических констант.

Если замещающий текст сравнительно длинный, его можно перенести на следующую строку, введя символ обратного слеша "\". Например, при запуске программы:

#define DIGIT 2\

3

...

printf(“\n%d”, DIGIT);

на экран будет выведено: 23

Замечание: если значение символической константы велико и его часть требуется перенести на следующую строку, то при разрыве этого значения между знаком ”\” и символом на следующей строке не должно быть непредусмотренных пробелов.

Предупреждение: в конце директив препроцессора не ставится точка с запятой.

Например, если создать следующую символическую константу:

#define LENGTH 12;

а затем попробовать её применить при объявлении массива,

int array[LENGTH];

то, расширяясь, выражение будет выглядеть как

int array[12;]

что синтаксически неправильно.

Символические константы дают возможность программисту присвоить константе имя и использовать ее далее в программе. Если возникнет необходимость изменить значение константы во всей программе, для этого достаточно будет внести только одно изменение в директиву препроцессора #define и перекомпилировать программу; значение константы будет изменено по всей программе автоматически.

Предупреждение: Учтите, что все, что находится справа от идентификатора символической константы, является замещающим ее текстом. Например, после выполнения директивы #define PI =3.14159, препроцессор заменит все имена PI на текст =3.14159.

Возможен другой метод использования именованных констант. Он заключается в использовании ключевого слова const. Например:

const int PI=3.14159;

Константные переменные являются данными определенного типа и их имена видны отладчику. А если используется символическая константа, то после того, как символическая константа была заменена на соответствующий текст, только этот текст и будет виден отладчику. Следовательно, символическую константу нельзя будет просматривать с помощью окна отладчика просмотра значений переменных watch.

Ниже приведены примеры определения с помощью директивы #define символических констант:

// определение строки текста:

#define ANYKEY "Нажмите любую клавишу"

// идентификатор DELETE в тексте просто удалится:

#define DELETE

// определение директивы #include:

#define GETSTD #include <stdio.h>

Хороший стиль программирования: для наглядности программного кода разумно использовать прописные (большие) буквы для именованных констант, чтобы отличать их от переменных Си.

Итак, какие преимущества в применении символических констант:

  1. при использовании символических констант программы становятся более удобочитаемыми (определенному числу или строке ставиться в соответствие осмысленное название);

  2. именованные константы позволяют легко модифицировать программы, заменяя значение константы только в одном месте (где она определена), нежели в каждом выражении, где она встречается.

  3. символические константы не требуют выделения памяти.

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