Лекция
Привет, сегодня поговорим про директивы препроцессора в языке си, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое директивы препроцессора в языке си, препроцессор , настоятельно рекомендую прочитать все из категории Алгоритмизация и программирование. Структурное программирование. Язык C.
Одной из самых распространенных директив является директива #define.
Эта директива используется для определения назначения указанных в ней идентификаторов.
Использование этой директивы внешне похоже на работу с константами. Каждая строка #define состоит из трех частей:
1) сама директива;
2) выбранная вами аббревиатура или идентификатор, который принято называть макрос;
3) подставляемые значения или список замены или тело.
Процесс начинающийся макросом и завершающийся процессом замены, называется макрорасширением.
Пример:
#include
#define TWO 2
#define FOUR TWO*TWO
#define PX printf ("x - это %d, \n", x)
int main (void)
{
int x = TWO;
PX;
x = FOUR;
PX;
}
При исполнении приведенной программы на этапе работы
препроцессор а происходят следующие замены: строка int x = TWO заменяется на int x = 2; строка PX на printf (…); x = FOUR на x = TWO*TWO, а затем на x = 2*2. Об этом говорит сайт https://intellect.icu . На этом процесс макрорасширения заканчивается, т.е. на этапе препроцесса умножение не исполняется, а исполняются только предложенные подстановки.
Результатом работы программы будет вывод двух строк:
x - это 2
x - это 4
При объявлении директивой #define значений превышающих длину строки возможно разбиение значения на несколько строк с использованием символа "\".
Пример:
#include
#define PX printf ("Сегодня первой па\
рой - алгоритмизация.\n")
int main (void)
{
PX
}
Если в приведенном примере перед слогом "рой" поставить несколько пробелов, то они будут выведены в результирующей строке. Используя аргументы директивы #define, можно создавать макросы функции, которые выглядят и действуют подобно функциям.
Пример:
#define SQUARE (x) x*x
Эта директива может быть использована в следующих операторах:
int x = 4;
int z;
1) z = SQUARE (2);
2) z = SQUARE (x);
3) z = SQUARE (x+2);
4) z = 100/SQUARE (2);
На этапе препроцесса первая запись будет заменена на z = 2*2; вторая на z = x*x; третья на z = x+2*x+2; четвертая на 100/2*2. Соответственно результатами будут значения: 4, 16, 14, 100.
Если в третьем случае необходимо исполнения действия (x+2)*(x+2), то подставляемое значение в директиве #define должно быть заменено на (x)*(x). При этом в четвертой записи получим z = 100/(2)*(2). Для исполнения этого действия как 100/(2*2) необходимо в директиве #define записать ((x)*(x)).
Иногда даже предусмотренные предосторожности не позволят обеспечить необходимый результат. Например, если в качестве аргумента используется инкремент или декремент.
К сожалению, в одной статье не просто дать все знания про директивы препроцессора в языке си. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое директивы препроцессора в языке си, препроцессор и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Алгоритмизация и программирование. Структурное программирование. Язык C
Из статьи мы узнали кратко, но содержательно про директивы препроцессора в языке си
Комментарии
Оставить комментарий
Алгоритмизация и программирование. Структурное программирование. Язык C
Термины: Алгоритмизация и программирование. Структурное программирование. Язык C