Макросы (C/C++)

Во время предварительной обработки макросы разворачиваются во всех строках, которые не являются директивами препроцессора (строки, не содержащие # в качестве первого символа, не являющегося пробелом), и в частях некоторых директив, которые не пропущены как часть условной компиляции. Директивы условной компиляции позволяют подавлять компиляцию частей исходного файла путем проверки константного выражения или идентификатора для определения того, какие блоки текста передаются в компилятор, а какие блоки текста удаляются из исходного файла во время предварительной обработки.

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

Если имя макроса найдено в исходном тексте программы или в аргументах некоторых других команд препроцессора, оно обрабатывается как вызов этого макроса. Имя макроса заменяется копией тела макроса. Если макрос принимает аргументы, фактические аргументы после имени макроса заменяются на формальные параметры в теле макроса. Процесс замены вызова макроса на обработанную копию тела называется расширением вызова макроса.

На практике это означает, что существует два типа макросов. Похожие на объект макросы не принимают аргументы, тогда как похожие на функцию макросы можно определить для принятия аргументов, чтобы они выглядели и действовали как вызовы функций. Поскольку макросы не создают фактические вызовы функций, иногда можно ускорить выполнение программы, заменив вызовы функций макросами. (В C++ подставляемые функции часто являются предпочтительным методом.) Однако если макросы не определять и не использовать с осторожностью, они могут привести к проблемам. Возможно, потребуется использовать круглые скобки в определениях макроса с аргументами, чтобы сохранить правильный приоритет в выражении. Кроме того, макросы могут неправильно обработать выражения с побочными эффектами. Пример getrandom см. в разделе Директива #define.

После определения макроса его невозможно переопределить другим значением, если сначала не удалить исходное определение. Однако макрос можно переопределить точно таким же определением. Таким образом, одно определение может использоваться в программе несколько раз.

Директива #undef удаляет определение макроса. После удаления определения можно переопределить макрос другим значением. Дополнительные сведения о #define и #undef см. в разделах Директива #define и Директива #undef соответственно.

Дополнительные сведения см. в следующих разделах:

См. также

Другие ресурсы

Справочник по препроцессору C/C++