Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Макросы

07.08.2019, 22:24. Показов 4957. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что такое Макросы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.08.2019, 22:24
Ответы с готовыми решениями:

Макросы
Ребята помогите!Надо переделать все пож макросы.Но в литературе как -то всё обрывками написано.непонятно как целиком программу писать! ...

макросы
#include <iostream> using namespace std; #define printarray(x,y)//вывод массива x-имя массива, y-число элементов???? int main() ...

макросы
Помогите со встроенными макросами, нигде не могу найти. Дайте ссылку на справочник по встроенным макросам либо можно выложить их здесь. ...

51
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2551 / 2065 / 971
Регистрация: 09.10.2013
Сообщений: 4,904
Записей в блоге: 4
07.08.2019, 23:22
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Студворк — интернет-сервис помощи студентам
ReYalp, если упрощенно макрос - это именованный кусок кода.
Применяются они для генерации текста программ.
Заведует макросами препроцессор - отдельная программа или модуль компилятора.
Препроцессор вставляет текст макроса на место "вызова" его как текст и ничего не знает от типах.
Получившийся результат передается на вход компилятора.

у gcc например есть специальный флаг -E - запустить только препроцессор.

Был код:
C++
1
2
3
4
#define MUL(X, Y) X * Y
 
int first = 2, second = 2;
int result = MUL(first, second);
После препроцессора они развернется в
C++
1
2
int first = 2, second = 2;
int result = first * second;
С макросами нужно быть аккуратным:
C++
1
2
3
4
5
6
#define MUL(X, Y) X * Y
 
int first = 2, second = 2;
int result = MUL(first + 2, second);
// После препроцессора получится...
int result = first + 2 * second; //  OOPS! совсем не то что ожидалось
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
07.08.2019, 23:24  [ТС]
Azazel-San, тоесть в моем случае
Цитата Сообщение от ReYalp Посмотреть сообщение
Вызов module_init() — это не вызов функции, а макрос, который устанавливает значение своего параметра в качестве функции инициализации для текущего модуля.
макрос выглядит примерно так ?
#define module_init(void) set_init_func(void)

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
макрос выглядит примерно так ?
#define module_init(void) set_init_func(void)
или с именами ?
#define module_init(void func) set_init_func(void func)
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
07.08.2019, 23:27
Цитата Сообщение от ReYalp Посмотреть сообщение
тоесть в моем случае
Откуда я знаю, что там в твоем случае?)
Это вырвано из контекста, покаж код.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.08.2019, 23:32
Цитата Сообщение от ReYalp Посмотреть сообщение
как инлайн функции?) или лямбда функции?
О, сколько умных слов вы знаете! Но встки сначала разберитесь в более простых вещах. А именно - в работе препроцессора. А она действительно чрезвычайно проста. Хотя ее использование может быть весьма изощренным.
Немножко философии. Что есть любая программа? Это преобразование одного текста в другой, и ничего более. Аппарат макросов предлагает несколько простых правил для этой работы. Конечно, с помощью этих правил можно сделать далеко не все. Но кое-что - можно.

Добавлено через 2 минуты
Цитата Сообщение от Max Dark Посмотреть сообщение
макрос - это именованный кусок кода.
Крутенько!
ReYalp, поверьте - все много проще!
2
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2551 / 2065 / 971
Регистрация: 09.10.2013
Сообщений: 4,904
Записей в блоге: 4
07.08.2019, 23:33
Цитата Сообщение от ReYalp Посмотреть сообщение
или с именами ?
C++
1
#define module_init(MOD_INIT_FUNC_NAME) some_dark_magic_with((MOD_INIT_FUNC_NAME))
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
07.08.2019, 23:34
Цитата Сообщение от ReYalp Посмотреть сообщение
или с именами ?
Макрос принимает только ПАРАМЕТРЫ, и "распаковывает" их в код.
В вашем примере void - это не тип. void - это имя параметра. Если в теле макроса вставить это имя, то оно будет заменено параметром, который передали при вызове макроса.

C++
1
#define module_init(void) set_init_func(void)
Вставка такого макроса в код
C++
1
2
3
4
module_init(blahblah()); 
module_init(blahblah);
module_init("blahblah");
module_init(1+1);
будет "распакована" вот в такой код:
C++
1
2
3
4
set_init_func(blahblah());
set_init_func(blahblah);
set_init_func("blahblah");
set_init_func(1+1);
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.08.2019, 23:35
ReYalp, вот, не поленился. Специально для вас
https://www.cyberforum.ru/blogs/18334/blog100.html
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
07.08.2019, 23:40  [ТС]
Байт, всмысле умных? разве инлайн функции не похожи на макросы? тоже заменяются (не всегда конечно),а лямбда похожи на макросы тем что тоже вставляются в код,но я уже понял что макросы вставляются на моменте препроцессора.
Azazel-San, Вам что-то даст кусок кода с явным вызовом макроса(или как назвать этот процесс)?
я спросил примерно,чтобы понять логику работы.

Добавлено через 1 минуту
Байт, та не стоило таких усердий,я понял что это такое.

Добавлено через 59 секунд
Max Dark, почему параметры в скобках?
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
07.08.2019, 23:40
Цитата Сообщение от ReYalp Посмотреть сообщение
я понял что это такое
Цитата Сообщение от ReYalp Посмотреть сообщение
разве инлайн функции не похожи на макросы?
Видимо не поняли
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2551 / 2065 / 971
Регистрация: 09.10.2013
Сообщений: 4,904
Записей в блоге: 4
07.08.2019, 23:42
ReYalp, макросы похожи больше на "найти и заменить" в текстовых редакторах
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
07.08.2019, 23:43
Цитата Сообщение от ReYalp Посмотреть сообщение
Azazel-San, Вам что-то даст кусок кода с явным вызовом макроса(или как назвать этот процесс)?
я спросил примерно,чтобы понять логику работы.
Ну откуда вы взяли эту цитату?
Я уверен там была не только она, а еще что-то, код какой-то или дополнение к цитате, ибо какой ф-и, какого модуля и т.д, это если вам нужен ответ на вопрос, "что там у вас".
А примерно уже вам описали.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
07.08.2019, 23:45  [ТС]
WxMaper, похожи и такие же это разные вещи

Добавлено через 1 минуту
Azazel-San,
C++
1
2
3
4
5
6
/* * hello.c – модуль ядра Hello, World! */
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h>
/* * hello_init – функция инициализации, вызывается при загрузке модуля. * В случае успешной загрузки модуля возвращает значение нуль, * и ненулевое значение в противном случае. */ static int hello_init(void) {        printk(KERN_ALERT "I bear a charmed life.\n");        return 0; }
/* * hello_exit – функция завершения, вызывается при выгрузке модуля. */ static void hello_exit(void) {        printk(KERN_ALERT “Out, out, brief candle!\n”); }
module_init(hello_init); module_exit(hello_exit);
MODULE_LICENSE("GPL"); MODULE_AUTHOR("Shakespeare"); MODULE_DESCRIPTION("A Hello, World Module");
вот текст
Это самый простой модуль ядра, который только может быть. Функция hello_init() регистрируется с помощью макроса module_init() в качестве точки входа в модуль. Она вызывается ядром при загрузке модуля. Вызов module_init() — это не вызов функции, а макрос, который устанавливает значение своего параметра в качестве функции инициализации для текущего модуля. Все функции инициализации должны соответствовать прототипу int my_init(void)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.08.2019, 23:46
Цитата Сообщение от ReYalp Посмотреть сообщение
разве
Чем-то похожи, да. Но я бы вам советовал не опираться на "похожесть", а конкретно разобраться в соответствующих механизмах. Вот когда вы сможете поставить над каждым постом этого топика свои пометки типа "бред", "о чем-то другом", "похоже на правду", вот тогда можете считать, что разобрались..
Удачи!
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2551 / 2065 / 971
Регистрация: 09.10.2013
Сообщений: 4,904
Записей в блоге: 4
07.08.2019, 23:46
Цитата Сообщение от ReYalp Посмотреть сообщение
почему параметры в скобках?
Параметры в макросах заключают в скобки, чтобы избежать неправильного раскрытия макроса(как в примере с MUL(first + 2, second))
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
07.08.2019, 23:49  [ТС]
Байт, уже сделал такие выводы) просто где-то в процессе своего обучения пропустил тему макросов ,видимо не было нужно,сейчас же чтобы нормально читать литературу подумал лучше разобраться ,спасибо всем
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
07.08.2019, 23:53
ReYalp, что-то типо такого будет
C++
1
#define module_init(x) __initcall(x);
Это линуксовская внутренняя штука, так что переопределять не стоит.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
07.08.2019, 23:55  [ТС]
Azazel-San, да я не спрашивал точно, а примерно, я понимаю и понимал что это API линукса .
0
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
08.08.2019, 00:02
Первое - макросы позволяют отсеить ненужное. Например вы можете под макросом скрыть определённую функцию. Если у вас Debug режим, то функция работает, если Realese - то нет. Там вы уменьшите код(который скомпилируется) и увеличите скорость работы программы. Второе - вы можете определяя константы в других файлах получать информацию, подключены или нет они и в зависимости от этого проводить манипуляции с кодом. Ну и третье, моё любимое. Есть такие макросы - __function__, _line_, _file_. подствляют значения в зависимости от нахождения в файле. На их основе пишутся логгеры.

Основное назначение макросов - манипуляция с кодом, а инлайн функции лишь оптимизация.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
08.08.2019, 00:02
Цитата Сообщение от ReYalp Посмотреть сообщение
похожи и такие же это разные вещи
C++
1
2
3
4
5
6
7
8
// вот вам макрос
#define macros(a,b) int c = a + b;
 
// а вот вам inline функция
inline void inline_fn(int a, int b)
{
    int c = a + b;
}
А теперь скомпилируйте 2 разных кода:
1
C++
1
2
3
4
5
6
int main()
{
    macros(1,1);
    printf("%d", c);
    return 0;
}
2
C++
1
2
3
4
5
6
int main()
{
    inline_fn(1,1);
    printf("%d", c);
    return 0;
}
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
08.08.2019, 00:11  [ТС]
WxMaper, так во втором случае ошибка ,это сразу видно, процедура ничего не возвращает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.08.2019, 00:11

Макросы в С++
Доброго времени суток. Подскажите, где можно почитать про написание макросов для классов? У меня есть класс class Transition { ...

Макросы
Здравствуйте, сделал программу, а мне еще сказали нужно сделать её с использованием макросов, знаю что это не долго и всё, не мог бы...

Макросы
Написать макрос находящий большое из 4 чисел в студии с++

макросы
#define EMPTY 0x00 #define ILLEGAL 0xF0 #define B_PRIVATE 0x01 // 1 бит - наличие #define W_PRIVATE 0x03 ...

Макросы с аргументами
Напишите программу, содержащую макросы с аргументами, вычисляющие площади различных геометрических фигур (например, квадрата,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru