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


директива #define (C/C++)

#define создает a макрос, ассоциация или параметризованного идентификатора со строкой идентификатора токена.После макроса указан, компилятор может заменить строку токена для каждого вхождения идентификаторов в файле источника.

Синтаксис

#defineИдентификаторtoken-stringOpt

#defineИдентификатор(ИдентификаторOpt,…,ИдентификаторOpt)token-stringOpt

Заметки

#define директива указывает компилятору заменить token-string для каждого вхождения Идентификатор в файле источника.Идентификатор заменяет только при формы маркер.То есть Идентификатор не заменяет, если он отображается в комментарий в строку или как часть более длинного идентификатора.Дополнительные сведения см. в разделе Токены C++.

token-string аргумент состоит из серии маркеров, например ключевые слова, константы или полные выписки.Один или несколько пробелов следует разделить token-string из Идентификатор.Этот пробел не считается частью замененного текст, и любой пробел, который следует за последним токеном текста.

A #define без a token-string удаляет вхождений Идентификатор из исходного файла.Идентификатор остается указанными и может быть проверено с помощью #if defined и #ifdef директивы.

вторая форма синтаксиса определяет a функция-как макрос с параметрами.Эта форма принимает необязательный список параметров, которые должны отображаться в скобки.После макроса определен, каждое последующее вхождение Идентификатор( ИдентификаторOpt,…, ИдентификаторOpt заменяет с версией) token-string аргумент, который содержит фактические аргументы заменил для формального параметра.

Имена формального параметра отображаются внутри token-string пометить места хранения фактические значения подставляются.Каждое имя параметра может встречаться несколько раз в token-stringи имен могут появляться в любом порядке.Число аргументов в вызове, должно соответствовать количеству параметров в определении макроса.Либеральная использование скобок гарантирует, что сложные фактических аргументов, интерпретируются правильно.

Формальные параметры в списке разделяются запятыми.Каждое имя в списке должно быть уникальным и список должен быть заключен в скобки.Пробелы не может разделить Идентификатор и открывающую круглую скобку.Используйте соединение линий - поместить обратную косую черту ("\) сразу после символа новой строки - для длинных директив на линиях составного источника.Область именем формального параметра распространяется на новой линии, которая завершает token-string.

Если макрос был определен в другой форме синтаксиса, последующие текстовые экземпляры за списком аргументов показано вызов макроса.Фактические аргументы которого следуют экземпляром Идентификатор в файле источника соответствие с соответствующим формальных параметров в определении макроса.Каждый формальный параметр in token-string (не предшествует stringizing#charizing ()#@или токен-вставить ()##оператор или) не следуют a ## оператор, заменяется соответствующим аргументом. фактическоеВсе макросы в фактическом аргументе развернуты перед тем, как директива заменяет формальный параметр.(Описанных в операторы операторы препроцессора.)

В следующих примерах макросов с аргументами иллюстрируют вторую форму #define синтаксис:

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

Аргументы с макросами причина побочных эффектов иногда чтобы дать непредвиденные результаты.Заданный формальный параметр может встречаться несколько раз в token-string.Если один формальный параметр заменяется выражением с побочными эффектами, то выражение с ее побочными эффектами, может быть вычислено более одного раза.(См. примеры вниз Оператор токена вставки (##).)

#undef директива препроцессора приводит к тому, что определение идентификатора быть забытым.См. #undef - Директива для получения дополнительных сведений.

Если имя, определянным происходит внутри макроса token-string (после результат другого расширения макроса), он не развернут.

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

Только для систем Microsoft

Microsoft C/C++ позволяет переопределить макрос, если новое определение синтаксически идентична исходному определению.Иначе говоря, 2 определения, могут иметь разные имена параметров.Эта функциональности отличается от ANSI C, который требует определения лексически 2 идентичны.

Например, следующие 2 макроса идентичны за исключением имен параметров.ANSI Язык c# не позволяет такое переопределение microsoft C/C++, но будет компилироваться без ошибок.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

С другой стороны, следующие 2 макроса не идентичны и формируют предупреждение в microsoft C/C++.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

ЭЛЕМЕНТ, относящийся Майкрософт

этот пример иллюстрирует #define директива:

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

Первая оператор определяет идентификатор WIDTH в качестве константы целого числа, и определяет 80 LENGTH с точки зрения WIDTH и константы целого числа 10.каждое вхождение LENGTH заменяет by (WIDTH + 10).в свою очередь, каждое вхождение WIDTH + 10 заменяет выражением (80 + 10).скобки вокруг WIDTH + 10 важны, поскольку они отслеживают интерпретация в выписках следующим образом:

var = LENGTH * 20;

После этапе предварительной обработки преобразуется в оператор:

var = ( 80 + 10 ) * 20;

что дает результат 1800.Без скобок, результат:

var = 80 + 10 * 20;

что дает результат 280.

Только для систем Microsoft

Определение макроса и константы с /D параметр компилятора имеет тот же эффект, что и using a #define директивы предварительной обработки в начале файла.До 30 макросов могут быть заданы с помощью параметра /D.

ЭЛЕМЕНТ, относящийся Майкрософт

См. также

Ссылки

Директивы препроцессора