Определение макросов
Форма директивы #define
#define имя определение
определяет макроимя. Везде, где в исходном файле встречается это имя, оно будет заменено его определением. Например, текст:
#define NAME "database" Connect(NAME);
после препроцессора будет заменен на
Connect("database");
По умолчанию имя определяется как пустая строка, т.е. после директивы
#define XYZ
макроимя XYZ считается определенным со значением – пустой строкой.
Другая форма #define
#define имя ( список_имен ) определение
определяет макрос – текстовую подстановку с аргументами
#define max(X, Y) ((X Y) ? X : Y)
Текст max(5, a) будет заменен на
((5 a) ? 5 : a)
В большинстве случаев использование макросов (как с аргументами, так и без) в языке Си++ является признаком непродуманного дизайна. В языке Си макросы были действительно важны, и без них было сложно обойтись. В Си++ при наличии констант и шаблонов макросы не нужны. Макросы осуществляют текстовую подстановку, поэтому они в принципе не могут осуществлять никакого контроля использования типов. В отличие от них в шаблонах контроль типов полностью сохранен. Кроме того, возможности текстовой подстановки существенно меньше, чем возможности генерации шаблонов.
Директива #undef отменяет определение имени, после нее имя перестает быть определенным.
У препроцессора есть несколько макроимен, которые он определяет сам, их называют предопределенными именами. У разных компиляторов набор этих имен различен, но два определены всегда: __FILE__ и __LINE__. Значением макроимени __FILE__ является имя текущего исходного файла, заключенное в кавычки. Значением __LINE__ – номер текущей строки в файле. Эти макроимена часто используют для печати отладочной информации.