#20. Директива #define для определения макросов-функций. Операции # и ## | Язык C для начинающих

preview_player
Показать описание


Учимся определять макросы-функции с помощью директивы #define. Операции # и ## для склейки строк и лексем.
Рекомендации по теме
Комментарии
Автор

Класс спасибо вам за урок, очень просто и доходчиво .

bulba
Автор

Спасибо за лучшие уроки. Я просмотрел все ваши уроки по всем плейлистам. Ощутил Невероятные путешествия по вашим знаниям. Наверно никто не делится знаниями как вы.

anvarx
Автор

Тема с двумя шарпами удивила. Первый раз такой функционал вижу

ceo-s
Автор

Спасибо ещё раз! Эту тему я как-то не запомнил, спустя недели две вернулся, сейчас пересмотрел. Оператор шарп аргумент макрос-функции превратит в строку, а двойной шарп создаёт некую конкатенацию двух частей.

trimo
Автор

Дополню. Что из-за озвученного в видео, про то что аргументы макроса подставляются в тело макроса в исходном виде (без вычисления и присвоения результата локальной переменной как это происходит в функции), то кроме проблем с приоритетом вычисления, также могут возникать дополнительные ошибки в логике вычисления, если аргумент макроса имеет побочные эффекты и используется несколько раз в теле макроса.
Допустим мы объявили, такой простой макрос, который возводит квадрат полученный аргумент, приоритет вычислений защитили скобками, вроде все ок.
#define POW2(x) ((x)*(x))
Но вот такой простой код, выведет на экран несколько неожиданный результат
int x = 1;
printf("%d", POW2(++x)); // выведет 9
Потому как в код будет подставлено ((++x)*(++x))
В то же время если бы мы написали "эквивалентную" функцию
int pow2(int x) { return x*x; }
То тут результат будет вполне ожидаемым
int x = 1;
printf("%d", pow2(++х)); // выведет 4
Вывод - с макросами надо держать ухо востро🙂

weerbox
Автор

Супер материал!!! Очень понятно объясняет
Такие ролики нужно в универах показывать на парах больше толку будет

renigat_tv
Автор

У вас ide ссылается на хедеры msvc? Для тех, кто использует рашсирение ms c/c++ нужно явно в настройках расширения указать путь до бинарника gcc и include

etherzon
Автор

Спасибо большое за Вашу работу! Скажите, пожалуйста, а когда появится курс по машинному обучению на степике?

АртемСавельев-ое
Автор

Вопрос. А эти макросы с параметрами (хотя бы по теории) можно заменить просто отдельными функциями? Или бывают ситуации, когда без них обойтись нельзя?

dimonhiper
Автор

Могут ли возникнуть какие-либо побочные эффекты, если, например, внутри main определить #define x2 sq(2)? x2 станет равна 4 на этапе препроцессора или на этапе компиляции, если sq — пользовательская функция?

ГущинАндрей-чы
Автор

у меня на шарп(#) в макрасе ругается визуал студио макрос с такими условиями не работают -
#define TEXT "square of rectangle ("#A") x ("#B")\n"
printf(TEXT(x - 5, y -4);
return 0;
lessons.c: In function 'main':
lessons.c:4:38: error: stray '#' in program
4 | #define TEXT "square of rectangle ("#A") x ("#B")\n"
| ^
lessons.c:12:8: note: in expansion of macro 'TEXT'
12 | printf(TEXT(x-5, y-4));
| ^~~~
lessons.c:4:39: error: expected ')' before 'A'
4 | #define TEXT "square of rectangle ("#A") x ("#B")\n"
| ^
lessons.c:12:8: note: in expansion of macro 'TEXT'
12 | printf(TEXT(x-5, y-4));
| ^~~~
lessons.c:4:47: error: stray '#' in program
4 | #define TEXT "square of rectangle ("#A") x ("#B")\n"
| ^
lessons.c:12:8: note: in expansion of macro 'TEXT'
12 | printf(TEXT(x-5, y-4));
| ^~~~
в чем может быть проблема???

ДмитрийСмирнов-лэл
Автор

Спасибо, урок супер! А мог бы ты объяснить, в каких случаях полезнее использовать макросы, а в каких функции? Пожалуйста!

elbinalfadorson
Автор

я чтото не понял вы вроде говорили про два шарпа но их не показали) тогда покажу я:

```
#include <stdio.h>
#define print(a, b, c) printf("%d", a##b##c);

int main(void)
{
print(2, 81, 34); // 28134
return 0;
}
```

lindx