Директивы препроцессора #define создают символические константы или макросы без параметров, обозначаемые идентификаторами, и макросы – операции, обозначаемые символьными строками. Формат директивы препроцессора #define при объявлении символической константы:
#define идентификатор_константы замещающий_текстЕсли замещающий текст длинный, его можно перенести на следующую строку, введя символ обратного слеша “\”. Приведённая форма директивы создаёт макрос без параметров, называемый обычно символической константой. После появления этой строки в файле все встретившиеся в тексте программы имена, совпавшие с элементом директивы идентификатор_константы, будут автоматически заменены на указанный в директиве замещающий_текст прежде, чем начнётся компиляция программы. Например:
//определение строки текста#define Anyk “Нажмите любую клавишу”//определение числа#define WIDTH 80#define LENGTH (WIDTH+10)Эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.
Скобки, содержащиеся в макроопределении, позволяют избежать недоразумений, связанных с порядком вычисления операций. Например, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в результате получится 780, а не 630.
Замена идентификатора константы не производится в комментариях и строках символов. Если замещающий текст в директиве не задан, то во всём тексте идентификаторы константы просто стираются.
Символические константы дают возможность присвоить константе имя и использовать его далее в программе. Если возникнет необходимость изменить значение константы во всей программе, для этого достаточно будет внести только одно изменение в директиву препроцессора #define и перекомпилировать программу; значение константы будет изменено по всей программе автоматически.
В С++ отдаётся предпочтение использованию именованных переменных типа const, а не символических констант. Константные переменные являются данными определённого типа и их имена видны отладчику. Если используется символическая константа, то после того, как она была заменена на соответствующий текст, только этот текст и будет виден отладчику. Преимуществом символической константы является то, что для хранения её значения не требуется дополнительной памяти.
Имеется ряд предопределенных символьных констант, предусмотренных стандартами на языки C и C++, в том числе:
_ _LINE_ _ - номер строки в исходном файле,_ _FILE_ _ - имя обрабатываемого файла,_ _DATE_ _ - дата начала обработки препроцессором,_ _TIME_ _ - время начала обработки,_ _STDC_ _ - программа должна соответствовать стандарту ANSI._ _cplusplus - компилировать программу в соответствии с синтаксисом С++,_ _PASCAL_ _ - последующие имена по умолчанию имеют тип “имя языка Pascal”