Раздел: Статьи / С/С++ / Препроцессор / Директивы /
Директива define
О том, что такое директива, можно узнать здесь. Добавлю только, что каждая директива препроцессора должна занимать отдельную строку. То есть если вы напишите так:
#include <stdio.h> #include <stdlib.h>
то это будет неправильно. Хотя компилятор не выдаст никакой ошибки. Но просто файл stdlib.h не будет подключен (в нашем примере) и вы не сможете использовать его функции в вашей программе.
Ну а теперь к теме. Директива #define определяет идентификатор и последовательность символов, которая будет подставляться вместо идентификатора каждый раз, когда он встретится в исходном коде. Пример:
#include <iostream>
#define sto 100
using namespace std;
int main()
{
cout << sto; //Выведет число 100
}
Здесь мы таким образом объявили константу и присвоили ей значение 100. Однако так можно делать не только с числами. В общем виде директива выглядит так:
#define Идентификатор ПоследовательностьСимволов
Обратите внимание, что здесь нет точки с запятой. Между идентификатором и последовательностью символов может быть любое количество пробелов. Однако признаком конца последовательности может быть только разделитель строк (конец строки).
Идентификатор также называется именем макроса. А сам процесс замены идентификатора именем называется макрозаменой (а также макрорасширением, макрогенерацией и макроподстановкой).
Определение макроса часто называют макроопределением или макрокомандой, а обращение к макросу - макровызовом или тоже макрокомандой.
Как использовать макросы - см. здесь.
После определения макроса его можно использовать в других макросах. Пример:
#include <iostream>
#define sto 100
#define trista 200 + sto
using namespace std;
int main()
{
cout << sto; //Выведет число 100
cout << trista; //Выведет число 300
}
Макрозамена - это просто замена идентификатора в исходном коде последовательностью символов, связанных с этим идентификатором. Эта последовательность может быть чем угодно. Например, вы можете сделать так:
#define scr cout << "Hello"
а затем в программе:
scr;
и это выведет на экран строку "Hello". Таким образом удобно определять какие-то строковые константы, но, в отличие от констант, это будут именно макросы, которые не просто содержат какую-то строку, но и выводят её на экран. К примеру, это может быть какое-то сообщение об ошибке:
#define ErrMsg cout << "Неизвестная ошибка" << endl
Здесь мы в конце ещё добавили перевод строки.
Если последовательность символов слишком длинная и не помещается в одну строку, то можно сделать так:
#define ABC "Это очень длинная строка, \ которую надо перенести при определении"
то есть с помощью символа \ мы объяснили препроцессору, что определение макроса продолжается на следующей строке. Но обратите внимание, что в случае со строкой мы закрываем кавычки только в самом конце строки. И при выводе этой строке она не будет разорвана - это будет одна строка. Так можно делать не только со строками:
#define xyz 1 + 2 + 3 + \ 4 + 5 + 6
Это тоже будет работать.
Имена макросов (идентификаторы) обычно пишут большими буквами. Хотя это и необязательно, но это позволяет программисту понять, что перед ним макрос, когда он встретит это имя в коде.