Раздел: Статьи / С/С++ / Препроцессор / Директивы /

Директива 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

Это тоже будет работать.

Имена макросов (идентификаторы) обычно пишут большими буквами. Хотя это и необязательно, но это позволяет программисту понять, что перед ним макрос, когда он встретит это имя в коде.


Все способы изучить С++ Все способы изучить С++

Начинающие программисты даже не догадываются о том, какой огромный пласт в этой области скрыт от их глаз, и чего многие из новичков не увидят никогда, потому что это тёмная сторона программирования - чистый исходный код системного уровня… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика