Поделиться через


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

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

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

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

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

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

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

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

См. также

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