Раздел: Статьи / С/С++ / Препроцессор / Директивы /
Директива 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), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |