Что нельзя сделать с помощью макросов

Что нельзя сделать с помощью макросов

Вопросы и ответы в сфере it технологий и настройке ПК

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

Что такое макрос и для чего он используется?

Макрос представляет собой инструмент в программе Ворд, который позволяет запоминать какие-либо определенные задачи и действия, а потом в дальнейшем автоматически их выполнять. Он является набором команд, при помощи которых можно автоматизировать выполнение повторяющихся действий. Такой элемент является очень важным и нужным, особенно для тех, кто привык экономить свое время.

Макрос в программе Ворд может использоваться для следующих целей:

  1. Для ускорения процесса обработки текста. В частности, с помощью этого элемента можно быстро заполнить требуемую область либо отформатировать содержимое документа.
  2. Для того чтобы объединить несколько команд. Согласитесь, создавать табличную форму в Ворд и потом еще наполнять ее содержимым довольно проблематично. Такого рода инструмент позволит быстро создать нужный параметр и в дальнейшем просто вставить его в требуемое место.
  3. Для того чтобы максимально упростить доступ к всевозможным параметрам, которые разбросаны в разных диалоговых окнах. Пользователи инструмента Ворд наверняка знают, как сложно порой отыскать требуемый элемент из-за обилия различных многоуровневых меню. Подобный компонент поможет заметно упростить эту задачу.
  4. Для того чтобы автоматизировать обработку тех действий, которые являются весьма сложными и рутинными. Макросы в Ворд умеют доводить до автоматизма те параметры, на которые, казалось бы, уходит очень много драгоценного времени.

Как создать макрос?

Естественно, чтобы воспользоваться этим инструментом в Word, его нужно вначале создать. Этот процесс не несет в себе много сложностей, поэтому справиться с ним сможет абсолютно любой пользователь.

Первый вариант — это создание подобного элемента при помощи специального средства для создания макроса. Оно может быть как встроено в Word, так и взято с каких-либо сторонних источников. Следует отметить, что этот пункт является довольно небезопасным, ведь в макросах, скачанных с интернета, запросто могут находиться вирусы, уничтожающие и крадущие важную для пользователя информацию. Поэтому прежде чем выполнять найденный элемент в Word, следует убедиться, что он чист от различного рода недоброжелательных элементов. Для этого просто нужно просканировать его антивирусом.

Второй вариант — это создать элемент такого рода для Word путем использования специального программного кода, пишущегося на языке под названием Visual Basic. Для этой цели необходимо предварительно обзавестись специальным редактором, который носит точно такое же название, как и сам язык программирования кода. Нужно сказать о том, что этот пункт достаточно сложен и вряд ли подойдет для рядового пользователя.

Есть возможность провести процесс создания макросов в Word путем комбинирования вышеприведенных методик. В результате получится стандартный элемент, который затем можно будет отредактировать и улучшить при помощи специального кода. Однако следует знать, что этот пункт, как и предыдущий, подходит лишь для опытных пользователей. Ведь для создания такого инструмента потребуются немалые знания в программировании.

Для создания макросов в редакторе MS Office Word следует выделить фрагмент, для которого будет создаваться макрос. Потом надо войти в меню «Вид — Макросы — Запись макроса», выполнить необходимые действия, которые надо записать, после чего выполняется остановка записи макроса. Для того чтобы его использовать, необходимо выделить фрагмент текста, к которому следует его применить, войти в меню «Вид — Макросы — Макросы — Выполнить» и выбрать имя сохраненного макроса.

Как видно, процесс создания подобных элементов не несет в себе каких-либо определенных сложностей. Здесь самое главное — это грамотный и обдуманный подход к делу, который в разы увеличит шансы на успех. Нужно заметить, что макросами могут пользоваться не только те, кому по роду службы необходимо заполнять объемные документы и бланки. В частности, прибегать к использованию такого рода инструментов могут и обычные пользователи, которым необходимо что-либо напечатать в Ворде, к примеру, какие-либо официальные документы. Ведь пользуясь подобным инструментом, можно сэкономить довольно большую часть своего времени и наделать намного меньше ошибок, чем при ручном вводе. Ведь, как показывает практика, использование таких элементов сводит на нет возможность ошибиться при последующем заполнении того же шаблона.

Отблагодари меня, поделись ссылкой с друзьями в социальных сетях:

Добрый день!

Эту статью я хочу посвятить такому огромному разделу MS Excel как макросы, а точнее начнем сначала и рассмотрим как создать макрос в Excel, для чего он нужен и как его использовать в своей работе.

Как вы знаете из собственного опыта, при работе с макросом есть очень много «рутинны», то есть производятся одни и те же операции и действия которые нужны для получения результата, это могут быть заполнение однотипных таблиц ну или бланков, обработка данных, похожие как близнецы еженедельные, ежемесячные отчёты, создание дашбордов и т.д. А вот использование макросов позволит вам производить эти действия в автоматическом режиме, используя возможности Excel на полную катушку, скидая эти рутинные и монотонные операции на мощные плечи Excel. Также причиной использования макросов может быть добавления нужных возможностей, которые еще не реализованы в стандартных функциях Excel (например, вывод суммы прописью, сбор данных на одном листе и прочее).

Если вы никогда не слышали о макросе, то самым точным его определением будет таким, это действия которые запрограммированы на определённую последовательность и записаны в среде программирования на языке Visual Basic for Applications (VBA). Запуск макроса может производиться многократно и это заставит Excel выполнять любую последовательность необходимых нам действий, которые вручную выполнять нам просто не нравится или не хочется. Несмотря на великое множество языков программирования для всего комплекса Microsoft Office стандартом является именно VBA и он работает в любом приложении офисного пакета.

Итак, создать макрос в Excel возможно 2 способами:

Создать макрос в Excel с помощью макрорекордера

Для начала проясним, что собой представляет макрорекордер и при чём тут макрос.

Макрорекордер – это вшитая в Excel небольшая программка, которая интерпретирует любое действие пользователя в кодах языка программирования VBA и записывает в программный модуль команды, которые получились в процессе работы. То есть, если мы при включенном макрорекордере, создадим нужный нам ежедневный отчёт, то макрорекордер всё запишет в своих командах пошагово и как итог создаст макрос, который будет создавать ежедневный отчёт автоматически.

Этот способ очень полезен тем, кто не владеет навыками и знаниями работы в языковой среде VBA. Но такая легкость в исполнении и записи макроса имеет свои минусы, как и плюсы:

  • Записать макрорекордер может только то, что может пощупать, а значит записывать действия он может только в том случае, когда используются кнопки, иконки, команды меню и всё в этом духе, такие варианты как сортировка по цвету для него недоступна;
  • В случае, когда в период записи была допущена ошибка, она также запишется. Но можно кнопкой отмены последнего действия, стереть последнюю команду которую вы неправильно записали на VBA;
  • Запись в макрорекордере проводится только в границах окна MS Excel и в случае, когда вы закроете программу или включите другую, запись будет остановлена и перестанет выполняться.
Читайте также:  Что делать после регистрации домена

Для включения макрорекордера на запись необходимо произвести следующие действия:

  • в версии Excel от 2007 и к более новым вам нужно на вкладке «Разработчик» нажать кнопочку «Запись макроса»;
  • в версиях Excel от 2003 и к более старым (они еще очень часто используются) вам нужно в меню «Сервис» выбрать пункт «Макрос» и нажать кнопку «Начать запись».

Следующим шагом в работе с макрорекордером станет настройка его параметров для дальнейшей записи макроса, это можно произвести в окне «Запись макроса», где:

  • поле «Имя макроса» — можете прописать понятное вам имя на любом языке, но должно начинаться с буквы и не содержать в себе знаком препинания и пробелы;
  • поле «Сочетание клавиш» — будет вами использоваться, в дальнейшем, для быстрого старта вашего макроса. В случае, когда вам нужно будет прописать новое сочетание горячих клавиш, то эта возможность будет доступна в меню «Сервис» — «Макрос» — «Макросы» — «Выполнить» или же на вкладке «Разработчик» нажав кнопочку «Макросы»;
  • поле «Сохранить в…» — вы можете задать то место, куда будет сохранен (но не послан) текст макроса, а это 3 варианта:
  • «Эта книга» — макрос будет записан в модуль текущей книги и сможет быть выполнен только в случае, когда данная книга Excel будет открыта;
  • «Новая книга» — макрос будет сохранен в тот шаблон, на основе которого в Excel создается пустая новая книга, а это значит, что макрос станет доступен во всех книгах, которые будут создаваться на этом компьютере с этого момента;
  • «Личная книга макросов» — является специальной книгой макросов Excel, которая называется «Personal.xls» и используется как специальное хранилище-библиотека макросов. При старте макросы из книги «Personal.xls» загружаются в память и могут быть запущены в любой книге в любой момент.
  • поле «Описание» — здесь вы можете описать, что и как должен делать макрос, для чего он создавался и какие функции несет, это чисто информативное поле, что называется на память.
  • После того как вы запустили и записали свой макрос, выполнив все нужные действия, запись можно прекратить командой «Остановить запись» и ваш макрос с помощью макрорекордера будет создан.

    Создать макрос в Excel в редакторе Visual Basic.

    В этом способе мы рассмотрим, как создать макрос в Excel через редактор программ на VBA который, как я говорил выше, встроен в любую версию Excel.

    Запуск редактора программ на VBA происходит по-разному, в зависимости от версии вашей программы Excel:

    • в версиях Excel 2003 и более старше, нам нужно в меню «Сервис», выбрать пункт «Макрос» и нажать «Редактор Visual Basic»;
    • в версиях Excel 2007 и более новее, нам нужно на вкладке «Разработчик» нажать кнопку «Редактор Visual Basic». В случае когда вы не находите эту вкладку вам нужно ее активировать выбрав пункт меню «Файл» — «Параметры» — «Настройка ленты» и в диалоговом окне флажком активируем вкладку «Разработчик».

    В открывшемся окне вы можете лицезреть интерфейс редактора VBA, здесь все написано по-английски и русификаторов не существует, можете не искать, а просто смиритесь и работайте, тем более что это только поначалу непонятно, а потом всё будет привычно.

    Итак, как же, работать в редакторе VBA, где что хранится и как создать макрос в Excel. Вопросы такого характера возникают сразу же, как только вы увидите редактор и сейчас все их будем рассматривать.

    Все наши макросы будут храниться в так называемых программных модулях. В любой из книг любой версии Excel нам доступно создание любых программных модулей в любом количестве и размещать в них все созданные нами макросы. Один модуль в состоянии содержать в себе любое количество нужных вам или созданных макросов. Модули доступны в окне «Project Explorer» и размещаются в верхнем левом углу редактора макросов (так же его можно вызвать комбинацией клавиш CTRL+R).

    Программные модули в редакторе VBA существуют в нескольких видах и используются для разных вариантов и ситуаций:

    • Обычные модули – самый распространённый вариант при создании макросов. Если вам нужно создание именно такого модуля, тогда выберете в пункте меню «Insert», пункт «Module». В открывшемся новом пустом окне нового модуля теперь можно вводить нужные команды на VBA посредством клавиатуры или же попросту копируя их с других источников, например с моего сайта;
    • Модуль «Эта книга» — размещен там же где и предыдущий в том же окне «Project Explorer» и в данный модуль сохраняют макросы, которые срабатывают при определенных действиях, которые имеют место в книге Excel, это могут быть отправка файла на печать, открытие или закрытие документа и т.п.
    • Модуль листа – может быть доступен там, где и предыдущие, а также через контекстное меню ярлыка листа, выбрав пункт «Исходный текст». В этот модуль записывают те макросы, которые нужно исполнять при выполнении событий на листе, такие как пересчёт листа, изменение данных в ячейке, удаление или копирование листа ну и т.д.

    Собственно сам макрос при работе в стандартном модуле выглядит следующим образом:

    Рассмотрим на примере работающего макроса «Расширенный фильтр»:

    • Все макросы в обязательном порядке будут начинаться с оператора Sub, после которого следует имя вашего макроса и список аргументов в скобочках. В случаях, когда аргументы отсутствуют скобки нужно оставить пустыми;
    • В обязательном порядке все макросы заканчиваются оператором End Sub;
    • Данные что находятся между операторами Sub и End Sub, является телом макроса, которое будет работать при запуске макроса. В примере, макрос проверяет диапазон данных и при вводе данных находит их в списке базы данных и накладывает фильтр, выводя указанное по критериям значение.

    Как видите второй способ более труден в использовании и понимании, если у вас отсутствует опыт в программировании вообще или в частности в VBA. Очень сложно понять и разобраться какие команды и как вводятся, какие аргументы он использует для того чтобы макрос начал выполнять свою работу в автоматическом режиме. Но дорогу осилит идущий, как говорили древние мудрецы и поэтому и вам не стоит опускать руки, а следовать заповедям дедушки Ленина…

    Создание кнопки для запуска макросов в панели инструментов

    Как я говорил ранее вы можете вызывать процедуру макроса горячей комбинацией клавиш, но это очень утомительно помнить какую комбинацию кому назначена, поэтому лучше всего будет создание кнопки для запуска макроса. Кнопки создать, возможно, нескольких типов, а именно:

    1. Кнопка в панели инструментов в MS Excel 2003 и более старше. Вам нужно в меню «Сервис» в пункте «Настройки» перейти на доступную вкладку «Команды» и в окне «Категории» выбрать команду «Настраиваемая кнопка» обозначена жёлтым колобком или смайликом, кому как понятней или удобней. Вытащите эту кнопку на свою панель задач и, нажав правую кнопку мыши по кнопке, вызовите ее контекстное меню, в котором вы сможете отредактировать под свои задачи кнопку, указав для нее новую иконку, имя и назначив нужный макрос.
    2. Кнопка в панели вашего быстрого доступа в MS Excel 2007 и более новее. Вам нужно клацнуть правой кнопкой мышки на панели быстрого доступа, которое находится в верхнем левом углу окна MS Excel и в открывшемся контекстном меню выбираете пункт «Настройка панели быстрого доступа». В диалоговом окне настройки вы выбираете категорию «Макросы» и с помощью кнопки «Добавить» вы переносите выбранный со списка макрос в другую половинку окна для дальнейшего закрепления этой команды на вашей панели быстрого доступа.
    Читайте также:  Pathfinder kingmaker как найти

    Создание графической кнопки на листе Excel

    Данный способ доступен для любой из версий MS Excel и заключается он в том, что мы вынесем кнопку прямо на наш рабочий лист как графический объект. Для этого вам нужно:

    • В MS Excel 2003 и более старше переходите в меню «Вид», выбираете «Панель инструментов» и нажимаете кнопку «Формы».
    • В MS Excel 2007 и более новее вам нужно на вкладке «Разработчик» открыть выпадающее меню «Вставить» и выбрать объект «Кнопка».

    После всего этого вы должны нарисовать кнопку на вашем листе при зажатой левой кнопке мыши. После окончания процесса рисования включится автоматически окошко, где вам нужно будет выбрать тот макрос, который обязан, выполнятся при нажатии на вашей кнопке.

    Как создать пользовательские функции на VBA

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

    К примеру, для создания пользовательской функции налога на добавленную стоимость, он же НДС, нам нужно открыть наш редактор VBA и добавить новый модуль, выбрать в меню «Insert» пункт «Module» и ввести туда текст для нашей функции: Следует заметить, что главное отличие функции от макроса это заголовок Function заменило Sub и в наличии заполненный список аргументов, в нашем примере это Summa. После того как наш код будет введен, он станет доступен в стандартном окне Мастера функций, который находится в меню «Формулы», пункт «Вставить функцию». И выбираем категорию «Определенные пользователем» в которой и будет отображаться наша написанная функция «NDS». После выбора нашей функции можно установить курсор на ячейку с аргументом, в которой будет содержаться та сумма, для которой мы считаем НДС, всё происходит, как и с обычной функцией. А на этом у меня всё! Я очень надеюсь что статья о том как создать макрос в Excel вам была понятной и полезной. Буду очень благодарен за оставленные комментарии, так как это показатель читаемости и вдохновляет на написание новых статей! Делитесь с друзьями прочитанным и ставьте лайк!

    P.S. Если вам очень интересно как работает макрос и где он применяется. С примерами вы сможете ознакомиться у меня на сайте в следующих статьях:

    Не забудьте поблагодарить автора!

    Не уметь переносить бедность постыдно; не уметь избавиться от неё трудом – ещё постыднее. Перикл

    • Переводы, 21 декабря 2017 в 19:10
    • Андрей Селивестров

    Программисты Си, дойдя до определённого уровня квалификации, обязательно сталкиваются с одной из особенностей этого языка — макросами. Почти во всех других языках аналога макросов нет. И это неспроста. Использование макросов может оказаться весьма небезопасным. В них скрывается ряд особенностей, специфика которых не всегда лежит на поверхности.

    Прим. перев. Макросы в таких языках, как Lisp, Scala и Rust, во многом лишены тех проблем и недостатков, которые описаны в этой статье.

    Макросы и функции

    При первом знакомстве макросы могут показаться обычными вызовами функций. Конечно, у них немного странный синтаксис, но они «ведут себя» как обычные функции. Тогда в чём разница?

    Макрос можно условно назвать функцией обработки и замены программного кода: после сборки программы макросы заменяются макроопределениями. Вот как это выглядит:

    Этот код преобразуется в следующий:

    При вызове же функции под неё выделяется новый стековый кадр, и она выполняется самостоятельно и не зависит от места в коде, откуда была вызвана. Таким образом, переменные с одинаковыми именами в разных функциях не вызовут ошибку, даже если вызывать одну функцию из другой.

    Но если попытаться проделать такой же трюк с помощью макроса, то во время компиляции будет выброшена ошибка, так как обе переменные в итоге будут находиться в одной функции:

    Один из способов решить эту проблему — поместить тело макроса в новую область видимости имён:

    Но если просто обернуть его в блок, то может возникнуть такая проблема: блок, в который раскроется использование bar , и стоящая после него точка с запятой будут учтены как две разные команды, и в результате, встретив else , компилятор выдаст ошибку.

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

    27–28 апреля, Москва и онлайн, 10 750–138 000 ₽

    Обычно эту проблему решают с помощью такого трюка:

    Такой цикл выполнится только один раз, но поскольку конструкция do-while в Си требует точки с запятой после условия, стоящая после макроса точка с запятой будет отнесена к нему, а не воспринята как отдельная команда.

    Более того, функции выполняют проверку типов: если функция ожидает на входе строку, а получает число, будет выброшена ошибка (или, по крайней мере, предупреждение, в зависимости от компилятора). Макросы в то же время просто заменяют аргумент, который им передан.

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

    Прим. перев. Чтобы не переходить к определению каждого макроса, можно попросить компилятор раскрыть макросы — это можно сделать с помощью команды gcc -E source.c . Имейте в виду, что если вы включаете в свой код с помощью #include стандартные заголовочные файлы, после препроцессинга в коде может оказаться много тысяч строк, так что стоит перенаправить вывод компилятора в файл.

    Тем не менее, можно выделить одно явное преимущество макросов перед функциями — производительность. Макрос быстрее, чем функция. Как уже упоминалось выше, под функцию выделяются дополнительные ресурсы, которые можно сэкономить, если использовать макросы. Это преимущество может сыграть весомую роль в системах с ограниченными ресурсами (например, в очень старых микроконтроллерах). Но даже в современных системах программисты производят оптимизации, используя макросы для небольших процедур.

    Читайте также:  Передайте привет обоих спортсменок уважаемые профессора

    Прим. перев. Интересный подход к оптимизации использования ресурсов в программе на Си рассмотрен в другой нашей статье.

    В C99 и C++ существует альтернатива макросам — встраиваемые (inline) функции. Если добавить ключевое слово inline перед функцией, компилятору будет дано указание включить тело функции в место её вызова (по аналогии с макросом). При этом встраиваемые функции могут быть отлажены, и у них есть проверка типов.

    Однако ключевое слово inline — это просто подсказка для компилятора, а не строгое правило, и компилятор может проигнорировать эту подсказку. Чтобы этого не произошло, в gcc есть атрибут always_inline , который заставляет компилятор встроить функцию.

    Встраиваемые функции — отличная штука, которая, как может показаться, делает использование макросов нецелесообразным. Однако это не совсем так.

    Когда использовать макросы в Cи

    Передача аргументов по умолчанию

    В C++ есть весьма удобный инструмент, которого нет в Си, — аргументы по умолчанию:

    В Си задача опциональных аргументов может быть решена с помощью макросов:

    Этот код довольно безопасен и не скрывает никаких подводных камней (их мы обсудим далее). Конечно, эту задачу можно также решить с помощью функции, но она достаточно тривиальна, чтобы нести накладные расходы при использовании функций. Макрос справляется с ней на ура.

    Использование отладочных строк

    Некоторые компиляторы предопределяют макросы, которые нельзя использовать в функциях: __FILE__ , __LINE__ , __func__ .

    Их можно включать в определения макросов, используемых для отладки:

    В итоге получается интересный способ ведения логов.

    Модификация синтаксиса

    Это очень мощная особенность макросов. Используя её, можно создать свой собственный синтаксис.

    Например, в Cи нет конструкции foreach . Но её можно создать через макрос:

    В этой вставке кода определена структура, содержащая связный список. Предполагая, что его узлы заполнены, можно пройтись по нему с помощью LIST_FOREACH так же, как и при использовании foreach в современных языках.

    Эта техника действительно очень эффективна и при правильном использовании может дать довольно хорошие результаты.

    Другие типы макросов

    Помимо макросов, которые подменяют функции, есть и другие очень полезные директивы препроцессора. Вот некоторые из наиболее часто используемых:

    • #include — включить содержимое стороннего файла в текущий файл,
    • #ifdef — задать условие для компиляции,
    • #define — определить константу (и, конечно же, макрос).

    #ifdef играет ключевую роль при создании заголовочных файлов. Использование этого макроса гарантирует, что заголовочный файл включён только один раз:

    Стоит отметить, что основное предназначение #ifdef — условная компиляция блоков кода на основе некоторого условия. Например, вывод отладочной информации только в режиме отладки:

    Прим. перев. С помощью #ifdef также довольно часто задаётся условие для компиляции на различных версиях ОС и архитектурах: #ifdef _WIN32 , #ifdef _WIN64 , #ifdef __linux__ и так далее.

    Как правило, для определения констант используется #define , но в некоторых проектах его заменяют на const и перечисления ( enum ). Однако при использовании любой из этих альтернатив есть свои преимущества и недостатки.

    Использование ключевого слова const , в отличие от макроподстановки, позволяет произвести проверку типов данных. Но в Cи это создаёт не совсем полноценные константы. Например, их нельзя использовать в операторе switch-case и для определения размера массива.

    Прим. автора В C++ переменные, определённые ключевым словом const , являются полноценными константами (их можно использовать в приведённых выше случаях), и настоятельно рекомендуется использовать именно их, а не #define .

    Перечисления в то же время — полноценные константы. Они могут использоваться в операторах switch-case и для определения размера массива. Однако их недостаток заключается в том, что в перечислениях можно использовать только целые числа. Их нельзя использовать для строковых констант и констант с плавающей запятой.
    Вот почему использование #define — оптимальный вариант, если нужно достичь единообразия в определении различного рода констант.

    Таким образом, у макросов есть свои преимущества. Но использовать их нужно весьма аккуратно.

    Подводные камни при использовании макросов

    Отсутствие скобок

    Наиболее распространённая ошибка, которую допускают при использовании макросов, — отсутствие скобок вокруг аргументов в определениях макросов. Поскольку макросы подставляются непосредственно в код, это может вызвать неприятные побочные эффекты:

    В этом примере выполняется вычисление MULTIPLY(x + 5) и ожидаемый результат — 50. Но в процессе подстановки произойдёт следующее преобразование:

    MULTIPLY(x + 5) -> (x + 5 * 5)

    Как несложно подсчитать, данное выражение выдаст не 50, а 30.

    А вот как выполнить данную задачу правильно:

    Инкремент и декремент

    Допустим, есть такой код:

    Здесь можно ожидать, что x будет увеличен на единицу и будет равен 6, а результат — 5. Но вот что получится в реальной жизни:

    Виновата всё та же макроподстановка: ABS(x++) -> ((x++)

    Как видно, x увеличивается на единицу в первый раз при проверке и во второй раз при определении результата, что и приводит к соответствующим итогам.

    Передача вызовов функций

    Использованием функции в коде никого не удивишь. Равно как и передачей результата одной функции в виде аргумента для другой. Часто это делается так:

    И в этой вставке кода всё в порядке. Но, когда это же производится с помощью макроса, можно столкнуться с серьёзными проблемами производительности. Допустим, есть вот этот код:

    Здесь определена рекурсивная функция sum_chars . Она вызывается один раз для первой строки ( str1 ) и другой раз — для второй ( str2 ). Но, если передать вызовы функций, как аргументы для макроса, будет выполнено три рекурсивных вызова вместо двух. Для больших структур данных это станет узким местом производительности. Особенно, если макрос используется внутри рекурсивной функции.

    Многострочные макросы

    Программисты не всегда используют фигурные скобки вокруг единичных команд в циклах и условных операторах. Но, если произвести макроподстановку внутри этого блока, и этот макрос будет содержать несколько строк, это приведёт к весьма интересным результатам:

    Во вставке кода выше нет фигурных скобок в первом цикле и, так как макрос заменяет одну строку несколькими, только первое выражение в макросе выполняется в цикле. Следовательно, это приведёт к бесконечному циклу, так как i никогда не увеличится.

    Прим. перев. Эту проблему также можно решить с помощью упомянутого выше трюка с do <> while (0) .

    Именно из-за таких особенностей многие стараются избегать использования макросов.

    Хорошая практика

    Чтобы свести к минимуму проблемы, вызванные использованием макросов, хорошей практикой будет использование единого подхода для определения макросов в вашем коде. Каким будет этот подход, не имеет значения. Есть проекты, в которых все макроопределения объявлены в верхнем регистре. В некоторых проектах в начале имени макроса используют букву «m». Выберите себе любой подход, но этот подход должен быть таким, чтобы и вы, и другой программист, который будет работать с вашим кодом, сразу понимал, что имеет дело с макросами.

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

    Вывод

    В большинстве случаев программисты предпочитают использовать функции, поскольку макросы скрывают некоторые серьёзные побочные эффекты. Тем не менее, использование макросов иногда более целесообразно. В этом случае нужно соблюдать правила их именования и учитывать специфику их использования, рассмотренную в статье.

    Ссылка на основную публикацию
    Что значит спящий режим компьютера
    В операционной системе Windows есть несколько режимов выключения компьютера – это обыкновенный режим, (который полностью выключает PC), режим гибернации и...
    Чем открыть файл с расширением dat
    После установки каких-нибудь программ, получения почты при помощи почтовых клиентов, на компьютере создаются .dat файлы. Чаще всего они почти не...
    Чем отличается frontend от backend
    Переводы , 13 апреля 2017 в 19:58 Мая Устинова Вы наверняка уже слышали эти модные в сфере программирования слова «фронтенд»...
    Что значит сторнировать документ
    Сто́рно (итал. storno — перевод на другой счёт, отвод; от stornare — поворачивать обратно) — в общем смысле возврат к...
    Adblock detector