Язык программирования C++

         

Определение макросов


Форма директивы #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__ – номер текущей строки в файле. Эти макроимена часто используют для печати отладочной информации.



Содержание раздела