директива #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.
ЭЛЕМЕНТ, относящийся Майкрософт