Часто полезно иметь возможность указывать значения константы без явного её написания. Один из методов состоит в присвоении переменной некоторого значения с возможной дальнейшей ссылкой на него. Директива #define определяет идентификатор и последовательность символов, в которую будет помещаться данный идентификатор при его обнаружении в тексте программы идентификатор также называется именем макроса, а процесс замещения называется подстановкой макроса.
Формат простой макроподстановки:
#define идентификатор последовательность символов,
где идентификатор строится по правилам образования идентификатора в языке Си.
Конец идентификатора определяется по появлению первого символа пробела. Идентификатор в директиве #define иногда называют символической константой. После того, как директива #define обнаружена препроцессором, все последующие появления в тексте программы идентификатора заменяется соответствующей строкой за исключением тех случаев, когда идентификатор появляется внутри двойных или одинарных кавычек.
Пример: #define NULL 0
Идентификаторы, которые появляются в макроподстановке, рекомендуется записывать прописными буквами для того, чтобы указать, что они являются символическими константами.
Пример. См. выше
if(p= =NULL)
a=b;
printf(“\n NULL”);
Из приведенных 3 операторов только в первом процессор сделает подстановку, так как NULL не является символической константой, а запись \n NULL не доступна для препроцессора. В качестве строки, используемые в директиве #define может указываться любая конструкция, допустимая в Си. Строка размещается в директиве #define после второго пробела. Первый пробел указывается после директивы #define. Если за последним не пробельным символом в строке указывается \ это означает, что строка имеет продолжение на следующей линии.
Пример.
#define STR((a>b||c>b)&&)
((d%f)= =0))
main()
{ int a,b,c,d,f;
if(str)
оператор;
……..
}
Очень часто макросы используются для определения так называемых магических чисел, используемых в программе. Например, программа может определять массив и иметь несколько процедур для работы с ним. Вместо того чтобы жёстко кодировать размер массива лучше определить макрос, соответствующий размеру массива и использовать его в тех местах, где необходимо использование размера. Следовательно, если необходимо изменить размер массива единственное, что требуется сделать – изменить оператор #define и перекомпилировать программу. Везде, где использовался данный макрос, произойдут автоматические изменения.
Пример:
#define MAX_SIZE 100
/*……..*/
float balance[MAX_SIZE];
/*…….*/
float temp[MAX_SIZE];
Для изменения размеров обоих массивов необходимо изменить определение MAX_SIZE.