Макросы для вара
Автор dexwow Просмотров 8.5к. Опубликовано
Мы решили собрать в одном месте все полезные макросы для воина в World Of Warcraft! В данной статье вы найдете как общие макросы для вара, так и макросы для отдельных специализаций.
PvE гайды по вару: Неистовство | Защита | Оружие
Общие макросы
В данном разделе собраны макросы, пригодные для использования воинами в любой ветке талантов.
1. Отмена Вихря клинков.
#showtooltip Вихрь клинков /cancelaura Вихрь клинков /cast Вихрь клинков
Данный макрос позволяет с легкость прерывать действие Вихря клинков прежде, чем истекут стандартные 6 секунд его действия. Порой это может быть очень полезно, поскольку во время действия Вихря клинков вар не может использовать другие способности.
Макросы для армс / фури вара
Ветки «Оружие» и «Неистовство»:
1. Кровавая баня + Нейронные пружины + Рев дракона.
#showtooltip Рев дракона /cast Кровавая баня /use 10 /cast Рев дракона
Макрос можно использовать в большинстве ситуаций для эффективного сочетания трех одноминутных кулдаунов, если ваш воин – инженер. Макрос следует использовать перед применением Удара колосса, чтобы получить выгоду от Кровавой бани.
2. Спам Героического прыжка.
#showtooltip Героический прыжок /cast !Героический прыжок
Позволяет спамить Героический прыжок так, чтобы подсвечиваемая зеленая цель на земле не исчезала после каждого нажатия.
3. Сочетание кулдаунов.
/cast Безрассудство /cast Знамя с черепом /cast Кровавое неистовство /cast Кровавая баня /cast Аватара /cast Жетон победы злонравного гладиатора /use 10
Также известен, как Свифти-макрос. Позволяет запускать все атакующие кд нажатием одной кнопки.
Макросы для прот вара
Ветка «Защита»:
1. Отмена Длани спасения / Длани защиты.
/cancelaura Длань защиты /cancelaura Длань спасения
Очень полезный макрос для танка. Позволяет одним нажатием отменять действие Длани защиты или Длани спасения, которые могут быть наложены на прот вара. Длань защиты не позволяет вам атаковать (и быть атакованным), а Длань спасения влияет на угрозу.
2. Бдительность по фокусу и курсору мышки.
#showtooltip Бдительность /cast [@mouseover] Бдительность
Применяет способность на цель под курсором мышки.
#showtooltip Бдительность /cast [@focus] Бдительность
Применяет Бдительность на запомненную цель.
3. Безудержное восстановление.
#showtooltip Безудержное восстановление /cast Ярость берсерка /cast Безудержное восстановление
Этот макрос позволяет назначить Ярость берсерка и Безудержное восстановление на одну кнопку.
4. Вмешательство по курсору мышки.
#showtooltip Вмешательство /cast [@mouseover] Вмешательство
Позволяет применять Вмешательство на цель под курсором мыши.
Видео
Видео по макросам для вара:
Ваншот макрос для дд воина:
Вам известные полезные макросы для пве или пвп вара, которые не были упомянуты в статье? Сообщите нам о них в комментариях, и мы непременно пополним ими запись!
У нас появился канал в Telegram, с новостями и гайдами по WoW! (для поиска с телефона наберите в телеграме слово «wowgaid«) Подписывайтесь, чтобы узнавать новости и гайды быстрее.
Подписывайтесь на наш канал в Telegram, чтобы первыми узнавать все новости и гайды World of Warcraft!
Макросы для Армс Воина ПвП 3.
3.5Играя воином в ветке Оружие (армс) в ПвП спеке, обязательно нужно иметь макросы, с ними намного легче играть и контролировать игру.
Макросы для Армс Воина в спеке ПвП (оружие)3.3.5
Если вдруг нужно принять большой урон вот он макрос на Глухую оборону.
#showtooltip Глухая оборона
/cast Оборонительная стойка
/equip назва вашей пухи
/equip назва вашего шита
/cast Глухая оборона
Эсли вдруг нужно обезоружить, и дать дизарм (милика, дд ) игроку который в бою против вас, тогда этот макрос самое то.
#showtooltip Обезоруживание
/cast [stance:2] Обезоруживание; [stance:1 / 3] Оборонительная стойка
Вот вам нужно быстренько добраться до цели своего напарника что б помочь ему или просто побегать помешать=) вот такой макрос
#showtooltip [stance:1] Рывок ; [stance:2] Вмешательство ; [stance:3] Перехват
/cast [stance:1] Рывок ; [stance:3] Перехват; [stance:2,exists,target= имя (ник) своего напарника] Вмешательство; [stance:2] Вмешательство
Вышло так что нужно отразить заклинания вот он Великолепный макрос для воина 3. 3.5 пвп армс
#showtooltip Отражение заклинания
/cast [stance:1 / 2,equipped: назва вашего щита] Отражение заклинания; [stance:3] Оборонительная стойка
/equip ваша одноручка
/equip назва вашего щита
Если нужно быстренько прервать каст вот идеальный макрос
#showtooltip [form: 1 / 2,worn:щиты] Удар щитом;[stance:1 / 3,noworn:щиты] Зуботычина; Героический бросок
/pc cmd sound:0
/cast Героический бросок
/cast [from:1 / 2,worn:щиты] Удар щитом
/cast [from:1 / 2,noworn:щиты] Зуботычина
/pc cmd sound:1 errframe:clear
Хотите быстренько кинутся на врага и пустить ему кровь вот такой макрос
#show [combat] Рывок
/cast [stance:2 / 3,nocombat] Боевая стойка;[stance:1,nocombat] Рывок
/cast [stance:2 / 3,combat] Боевая стойка;[stance:1,combat] Рывок
/cast [stance:1 / 3] Кровопускание
Если вдруг попался шаман вот макрос на снятия тотемов, наводим на них и жмем.
/cast [target=mouseover] Выстрел
Макросы для Вара | Мир World of Warcraft
При современной игре и при постоянном совершенствовании персонажей, без макросов обойтись достаточно сложно, особенно Вару. Макросы для Вара будут способствовать более быстрому применению заклинаний, проведению бурстовых атак и улучшению ДПС. Современный Вар, не важно какой ветки, без макросов совершенно не сможет сделать то, что делают более профессиональные игроки.
Все макросы будут построены на нескольких модификаторах – это Shift, ctrl, и Alt. Главное для Вара – это научиться на макросах отрабатывать все главные навыки, что позволит более точно входить в разные стадии боя.
Содержание гайда:
Макрос на мгновенную атаку
Сочетание достаточно интересное, но главное запомнить тактическое построение ударов Вара.
/target [@mouseover] /use [nomod]Сокрушение;[mod:shift,mod:alt]Рассекающий удар;[mod:shift]Оглушающий удар;[mod:alt]Удар щитом;[mod:ctrl]Ударная волна
/use [mod:alt]Мощный удар щитом
/startattack
Здесь с помощью наших модификаторов мы с легкостью сможем менять три заклинания для мгновенной атаки Вара по фокусу.
Лучшие аддоны для Вара
Макрос на «Реванш», «Прыжок» и «Крик»
Этот макрос можно использовать для начала бурстовой атаки или для того, чтобы достигнуть противника и задать ему по полной.
/target [@mouseover] /use [nomod]Реванш;[mod:shift,mod:alt]Героический бросок;[mod:shift]Героический прыжок;[mod:alt]Деморализующий крик;[mod:ctrl]Мощный удар щитом
/startattack
Макрос будет работать с данными заклинаниями точно так как и первый макрос. С помощью правой кнопки вешается «Реванш», через Shift + правая кнопка будет использован «Героический прыжок», а через Alt + правая кнопка будет применён «Деморализующий крик».
Прото Вар 3.3.5 ПвЕ Армс Вар 3.3.5 ПвЕ Фури Вар 3.3.5 ПвЕ
Макрос на бурстовую атаку Вара
Работа макроса сосредоточена для средней кнопки мыши, что очень удобно для бурстовой атаки Вара. В результате у нас что получается: начинаем с левой кнопки, далее продолжаем с помощью правой кнопки и завершаем бурст нашим третьим макросом, который сделать под среднюю кнопку мыши.
/target [@mouseover] /use [nomod]Рывок;[mod:shift,mod:alt]Внутренняя ярость;[mod:shift]Удар грома;[mod:alt]Кровопускание;[mod:ctrl]Устрашающий крик
И все по той же схеме, что и предыдущие макросы для Вара. При нажатии будет сделан «Рывок», а далее через наши модификаторы полетит «Ярость», «Удар грома», «Кровопускание» и наш «Устрашающий крик».
Макрос на использование стоек Воина
Вы сможете с помощью макроса активировать в любой момент любую необходимую вам стойку.
/use [nomod]Ярость берсерка;[mod:shift,mod:alt]Глухая оборона;[mod:shift]Стойка берсерка;[mod:alt]Оборонительная стойка;[mod:ctrl]Боевая стойка
/use [mod:shift,mod:alt]Ни шагу назад
/use [mod:shift,mod:alt]Безудержное восстановление
/use 13
/startattack
Так как Вар чаще всего в ПвП использует стойку «Ярость берсерка», то мы в макросе ее поставили без всякого модификатора. Остальные стойки все работают и запускаются через них. «Глухую оборону» можно включить при нажатии Shift + Alt и клик мышки, «Оборонительная стойка» запускается при нажатии Alt и клик, «Боевую стойку» мы будем запускать через Ctrl и клик мышки.
Лучшие ПвП аддоны Лучшие ПвЕ аддоны
Макрос на завершение бурста
Его можно биндить на ту кнопку, которую вам наиболее удобно использовать. Так как мы совершаем череду атак, которые переходят в бурст, то его так же грамотно с помощью макросов можно завершить.
/use [nomod]Блок щитом;[mod:shift,mod:alt]Сокрушительный бросок;[mod:shift]Отражение заклинания;[mod:alt]Обезоруживание;[mod:ctrl]Каменная форма
/startattack
Помните, что Вару наиболее лучше использовать Сокрушительный наш бросок только после того, как мы поменяем стойку. Заклинание становится наиболее эффективным.
Макрос на завершающий цикл атак
Получается так, что если ваша цель не слегла после проведения первого бурста, то необходимо противника подготовить ко второму циклу атак. Именно цепочка из следующих заклинаний для этого превосходно подходит.
/use [nomod]Вызывающий крик;[mod:shift]Подрезать сухожилия;[mod:alt]Вмешательство;[mod:ctrl]Провокация
Здесь тоже необходимо учитывать момент, что Подрезание сухожилий наиболее эффективно работает после смены вашей стойки.
Лучшие приколы WoW
Макрос на слив и генерацию ярости
В бою вам необходимо постоянно контролировать ярость. Необходимо так же правильно ее сливать, если ярость уже в избытке и при необходимость быстро ярость восстанавливать. Как ни крути, а Воин – класс достаточно сложный.
/use [nomod]Удар героя;[mod:alt]Боевой крик;[mod:ctrl]Командирский крик
/use [nomod]Удар
При использовании модификаторов ярость будет генерироваться, без них просто можно ее сливать. Помните, что вы можете этот макрос забиндить на любую удобную вам кнопку.
Макрос на восстановление ХП
У вара нет заклинаний способных при необходимости его отхилить. Нам остается только восстанавливать свое ХП с помощью различных флаконов, зелий, еды и так далее.
/use [nomod]4 1;[mod:shift,mod:alt]4 2;[mod:shift]4 3
/use [nomod]4 4
Цифры в макросе будут обозначать те ячейки на панели, в которых будут лежать флаконы с ХП, бинты, разный хавчик и возможно камень от Лока. Соответственно через модификаторы будут активироваться те или иные восстановители.
Макрос для оказания помощи напарнику
Всегда приходится в ПвП спасать либо себя, либо помогать напарнику и отвлечь насевших на него противников.
#showtooltip Удар щитом
/cast [nomodifier,help,nodead]Вмешательство; [nomodifier,nohelp] Удар щитом;
/cast [modifier:alt] Скакун всадника без головы
Если в таргете у вас окажется ваш напарник, то вы будете применять «Вмешательство». Если же окажется в таргете противник, то Вар будет его сначала замедлять, а после сбивать его каст. Если использовать Alt то макрос для Вара начнет кастовать маунта.
Макрос для Вара на его стойки
Основа макроса в том, что стойки могут меняться с помощью прокручивания колесика мышки. Если честно, то это не особо удобно, но достаточно прикольно.
/cast [stance:1] Стойка берсерка
/cast [stance:3] Оборонительная стойка
/cast [stance:2] Боевая стойка
Возможно использовать только в ПвП, но и то на любителя.
Макрос на использование «Смертельного удара»
/cast Смертельный удар
/cast Удар героя
Отлично работает, когда Вар ведет игру в соло. Но и здесь необходимо быть более чем аккуратным, так как не для каждого момента боя этот макрос подойдет.
Макрос на чардж и на замедление
Противник будет постоянно пытаться уйти от ваших атак. Вару же необходимо ка можно больше наседать на цель. Так вот – этот макрос именно для этого и сделан. Если вам необходимо догнать противника и начать его прессовать.
/cast Рывок
/cast Подрезать сухожилия
В ПвП, по сути, этот макрос необходим вару как воздух.
Макрос для АоЕ урона
Еще данный макрос превосходно себя зарекомендовал на БГ, когда собирается толпа противника и начинается мясорубка, где сложно кого то отдельно выделить и что то вообще разобрать.
/cast Размашистые удары
/cast Возмездие
Макрос на АоЕ бурст, снятие блейдшторма и длани
/startattack
/cast Смертельный удар
/cast Размашистые удары
/cancelaura Вихрь клинков
/cancelaura Длань защиты
Многие не достаточно эффективно играют только потому, что не могут своевременно провести комбинации ударов. С помощью макросов все комбинации будут у вас под рукой и на все случаи нашей жизни. Чаще Макросы для Вара способны помочь вам реализовать то, до чего достаточно сложно достичь самостоятельно.
Макросы для воина (вара) пве 3.3.5
Каждый кто хочет идеально играть варом в пве 3.3.5 должен иметь и уметь пользоваться макросами, которые повысят ваш ДпС, и сделают вашу игру проще.
Смотрим делаем.
Макросы больше подходят для танка вара пве 3.3.5
Перерыв каста макрос воина в ветке защита 3.3.5 пве #showtooltip [form:1/2,worn:Щиты] Удар щитом;[stance:1/3,noworn:Щиты] Зуботычина;Героический бросок
/ps cmd sound:0
/cast Героический бросок
/cast [form:1/2,worn:Щиты] Удар щитом
/cast [stance:1/3,noworn:Щиты] Зуботычина/ps cmd sound:1 errframe:clear
Такой макрос позволит сделать вмешательство на дружественную цель, на врага будет заведена Провокация, ну а с зажатым шифтом вар пве сделает перехват.
#showtooltip
/castsequence [harm] reset=15 Рывок, Перехват, Рывок; [help ] Вмешательство
#showtooltip
/cast [noharm]Вмешательство;[stance:2,mod:shift]Рывок;[stance:2]Провокация;Перехват
#showtooltip [stance:1] Рывок ; [stance:2] Вмешательство ; [stance:3] Перехват
/cast [stance:1] Рывок; [stance:3] Перехват; [stance:2,exists,target=Имя_Напарника] Вмешательство;[stance:2] Вмешательство
Ну и самый главный макрос на танка это макрос агро для вара 3. 3.5 пве.
#show [stance:1]Дразнящий удар;[stance:2]Провокация;[stance:3]Оборонительная стойка
/cast [stance:1]Дразнящий удар;[stance:2]Провокация;[stance:3]Оборонительная стойка
Макросы для Фури вара пве 3.3.5
Начнем с ярости ведь без нее вар в пве 3.3.5 никакой. #showtooltip
/castsequence reset=20 Ярость берсерка, Кровавая ярость
#showtooltip Ярость берсерка
/cast Ярость берсерка
/cast !Удар героя
/cast Вихрь
/cast !Рассекающий удар
#showtooltip Кровожадность
/cast Кровожадность
/cast !Рассекающий удар
Вот макрос для вара в стойке Неистовство (фури) на бой в двох вариантах
#showtooltip Кровожадность
/cast Кровожадность
/cast !Удар героя
#showtooltip Вихрь
/cast Вихрь
/cast !Удар героя
#showtooltip Мощный удар
/cast Мощный удар
/stopcasting Мощный удар
/startattack
И помним как есть написан макрос так и пишем в игре, любой пробел сделает не способным макроса.
Вар оружие 4.3 4 пве. Таланты и макросы
Представляем вашему вниманию ПвЕ гайд по армс вару для патчей WoW 4.3 и 4.3.4. В данном гайде представлены все основные аспекты игры дд воином ветки «Оружие» (Arms Warrior) в Катаклизме: таланты, билд, символы, ротация, экипировка и многое другое.
Доступна более свежая версия гайда:
Видео гайд по армс вару 4.3.4:
Изменения в 4.3 и 4.3.4
В патче 4.3 и последующем 4.3.4 ПвЕ армс вары получили весьма мало изменений:
- Смертельный удар теперь снижает получаемое целью исцеление на 25%, а не на 10%.
- При использовании нескольких способностей, накапливающих ярость, снижается скорость спадения ярости.
PvE аддоны
Рейдовые аддоны:
Другие полезные аддоны:
- / / — отслеживание баффов и дебаффов.
Больше полезных модификаций вы можете найти на странице « «.
Таланты/билд
Распределение талантов у ПвЕ армс вара довольно простое. Большинство возможных талантов являются обязательными и лишь несколько талантов – опциональные.
Основой вашего билда должна стать раскладка талантов 30/7/1 . Оставшиеся 3 очков талантов вложите в нужные вам опциональные таланты: «Блиц», «Барабаны войны», «Низвержение», «Кровь и гром».
На изображении вы видите талант «Блиц» взятым 1/2. Этот талант не является обязательным для воина, вы можете вложить 1 очко либо в «Барабаны войны», чтобы снизить затраты ярости на сбивание кастов, либо в «Низвержение», если вам в бою требуется оглушение
Подробнее об опциональных талантах :
- 1/2 Блиц: часто берется именно этот талант, основная польза которого заключается в дополнительной ярости после использования рывка.
- 1/2 Барабаны войны: берется в том случае, если в бою вам требуется часто сбивать касты.
- 1/1 Низвержение: дает армс вару оглушение одной цели на 5 секунд. В ПвЕ этот талант может быть взят для сражений, где много монстров, которых можно оглушить.
- 3/3 Побуждение: повышает вероятность критического эффекта Удара героя на 15%; также при критическом эффекте Удара героя следующий Удар героя 100% будет критическим. Этот талант очень желателен в боях с одной целью, а в АоЕ ситуациях бесполезен, поскольку Удар героя в них не используется.
- 2/2 Кровь и гром: позволяет развешивать Кровопускание по всем целям вокруг с помощью Удара грома, если Кровопускание висит хотя бы на 1 цели. Это превосходный талант в боях с большим количеством монстров.
Символы
Основные символы :
- Символ смертельного удара
- Символ превосходства
- Символ мощного удара
Большие символы :
Для боев с одной целью почти нет реально полезных в ПвЕ символов для дд армс вара. Ниже приведен список символов, которые вы могли бы использовать в той или иной ситуации.
- Символ размашистых ударов – снижает затраты ярости на способность Размашистые удары, что может быть полезно в некоторых боя, но совершенно не нужно в боях с одной целью.
- Символ стремительного рывка – снижает восстановление рывка на 1 сек, что совсем чуть-чуть может увеличить ваш дпс.
- Символ рассечения – способность поражает 3 противников вместо 2. Может пригодиться воину только в боях с 3+ противниками.
- Символ героического броска – при Героическом броске на противника также накладывается эффект Раскола брони. Символ может быть полезен только если вам нужно постоянно поддерживать Раскол брони на цели.
- Символ удара колосса – при Ударе колосса на противника накладывается Раскол брони. Используется, если необходимо постоянно поддерживать Раскол брони на цели.
- Символ глухой обороны – снижает урон на 20%, но увеличивает время восстановления способности.
Малые символы :
- Символ властности
- Символ боевого крика
- Символ ярости берсерка
Приоритет основных характеристик
Приоритет характеристик в ПвЕ для армс вара в патчах 4. 3 и 4.3.4 выглядит следующим образом:
Сила > Меткость (до капа) > Критический удар > Мастерство > Искусность > Скорость
Сила . Однозначно самая лучшая характеристика для воина, значительно перевешивающая все прочие характеристики. Армс вару следует набирать Силу всеми возможными способами.
Меткость . Следующая по важности характеристика, которую следует набирать вплоть до капа. В Катаклизме кап меткости для воина – 8% или 961 рейтинга меткости. По достижении капа характеристика становится бесполезной, и ее излишки стоит переделывать в другие статы.
Рейтинг критического удара
. Самая ценная из вторичных характеристик, польза от которой, однако, сопоставима с пользой от Мастерства (пока не набран кап*). В идеале, вы должны набирать Мастерство, не жертвуя при этом Критическим ударом.
*Кап мастерства – 26.
Искусность . Следующая после капа мастерства полезная характеристика. В специализации «Оружие» искусность повышает шанс нанести дополнительный удар со 100% урона от оружия.
Перековка
Поскольку нельзя набирать перековкой Силу, самой приоритетной характеристикой для воина становится меткость. Затем мы советуем набрать кап мастерства. Когда все капы набраны, их излишки, а также рейтинг скорости перековывайте в рейтинг критического удара. В идеале, на всех ваших вещах должен быть рейтинг критического удара – либо от экипировки, либо от перековки.
Армс вару при перековке следует придерживаться вышеозначенного приоритета характеристик.
До достижения капа меткости :
Скорость > Искусность > Мастерство перековывать в Меткость
До достижения капа мастерства :
Скорость > Искусность > Критический удар (в редких случаях) перековывать в Мастерство
Дальнейшая перековка :
- Если есть излишки меткости, а кап мастерства набран – перековывайте меткость в Искусность (предпочтительнее) или Критический удар.
- Если есть излишки мастерства, все капы набраны – перековывайте мастерство в Критический удар (предпочтительнее) или Искусность.
- Скорость перековывайте в Критический удар > Искусность.
- Искусность перековывайте в Критический удар.
Камни
ПвЕ армс вару сила гораздо важнее всех прочих характеристикик, поэтому во все гнезда должны быть вставлены красные камни на силу, вне зависимости от цвета гнезд. Исключением являются те случаи, когда бонус от соответствия цвета даст вам +20 или больший бонус силы. В этом случае вставляйте подходящие по цвету камни.
Особое гнездо: | Рокочущий мглистый алмаз |
Красное гнездо: | Рельефный королевский гранат |
Желтное гнездо: | Покрытый письменами лавовый коралл |
Синее гнездо: | Гравированная сумрачная шпинель |
Наложение чар
Голова: | Магический знак Громового молота (А) Магический знак Драконьей Пасти (О) |
Плечи: | Великое начертание зазубренного камня |
Спина: | +65 критического удара |
Грудь: | +20 ко всем характеристикам |
Запястья: | +50 силы |
Кисти рук: | +50 силы |
Пояс: | Поясная пряжка из эбеновой стали |
Ноги: | Накладки для поножей из чешуи дракона |
Ступни: | Лавоход |
Оружие: | Обвал |
Ротация
Ротация пве армс вара сильно зависит от действующих положительных эффектов и проков. В целом, в 4.3.4 она должна быть примерно следующей.
У цели больше 20% здоровья:
- Вешайте на противника Кровопускание и поддерживайте его (обновляется Смертельным ударом)
- Используйте Удар колосса и в течение 6 секунд после как можно больше способностей, вроде Превосходства, Смертельного удара, Мощного удара и Удара героя.
- Используйте Превосходство. Не обязательно применять его сразу после прока Вкуса крови, у вас будет на его применение еще 5 секунд.
- Используйте Мощный удар для наполнения и сброса ярости.
Когда здоровья цели упадет до 20%, армс вар начинает использовать Казнь, и ротация становится следующей:
- Поддерживайте на противнике Кровопускание.
- Используйте Смертельный удар по кд.
- Используйте Удар колосса так часто, как это возможно. Убедитесь, что в течение 6 секунд после него вы можете ударить Казнью как можно больше раз.
- Используйте Казнь.
- Бейте Превосходством, если у вас мало ярости, так как Превосходство нанесет больше урона, чем Казнь.
- Применяйте Удар героя при проке Упоения боем или чтобы избежать накопления максимума ярости
Подробнее о способностях и механике :
Удар колосса . Эту способность нужно использовать скорее для отрицательного эффекта на цели, нежели для нанесения урона.
Кроме того стоит помнить, что благодаря таланту Внезапная смерть в ветке Оружие атаки ближнего боя с вероятностью 6% могут мгновенно завершить время восстановления Удара колосса. Поскольку этот эффект не имеет внутреннего кулдауна, вам стоит использовать его всегда, когда это возможно.
Наконец, вам стоит дождаться, пока эффект Удара колосса спадет с цели прежде, чем применять следующий (в случае, если кд пройдет очень быстро), для того чтобы эффект Удара колосса не пересеклись.
- Используйте как можно больше способностей, пока эффект активен
- Не применяйте способность, пока эффект от предыдущего Удара колосса активен.
- Используйте Удар колосса как можно чаще. Однако, вы можете немного придержать его, чтобы дождаться восстановления важных способностей (например, Смертельного удара).
Упоение боем . Благодаря данному таланту воин после применения Смертельного удара с вероятностью 15% сможет применить следующую способность без затрат ярости. Данный прок отлично подходит для использования тех способностей вара, на которые тратится много ярости.
Лучше всего как-нибудь отслеживать данный прок (например, с помощью аддона Power Auras) и тратить его на Удар героя, так как это самая дорогая из способностей. Более того, Удар героя не влияет на гкд.
Казнь и Палач . Когда у противника остается менее 20% здоровья, армс воин может использовать Казнь. Урон этой способности во многом зависит от количества ярости, накопленной у воина в данный момент. Базово Казнь стоит 10 ярости, но если она будет применена с большим количеством ярости (вплоть до 30), она нанесет гораздо больше урона.
Использованная при малом количестве ярости, Казнь может уступать в уроне другим способностям, в том числе Превосходству.
Каждый раз при использовании Казни вы будете получать эффект Палач, повышающий скорость атаки на 5% за раз, вплоть до 25%.
Когда у цели станет меньше 20% здоровья, вам не следует сразу же переходить на использование одной только Казни, дабы быстро накопить +25% скорости атаки. Продолжайте использовать Смертельный удар и Удар колосса (и Превосходство и Мощный удар, если они бьют сильнее Казни) и потихоньку переходите на использование Казни. После этого пристально следите за эффектов +25% к скорости атаки и старайтесь не потерять его.
Использование кулдаунов
Правильно выбранное время для использования кулдаунов позволит дд воину нанести больше урона. В ПвЕ сражениях используются следующие способности:
Смертельное спокойствие . Стоит так часто использовать в бою, как это возможно. Имейте в виду, что эта способность запускает 15-секундое кд на Безрассудство, а оно, в свою очередь, запускает 12-секундное кд на Смертельное спокойствие. То есть вы не можете использовать их одновременно. Изложенное ниже и ваш собственный опыт игры варом помогут вам определить правильное время для использования Смертельного спокойствия:
- Применяйте эту способность, когда у вас мало ярости (слейте ярость с помощью Удара героя, если нужно)
- Используйте Удар колосса во время действия этого эффекта
- Используйте Удар героя по кд во время действия эффекта
- Избегайте использования способности совместно с БЛом.
Безрассудство . Нужно использовать в бою как можно чаще (обычно – 2 раза). Старайтесь так подбирать время для использования Безрассудства, чтобы во время его действия нанести как можно больше ударов (в том числе под активным эффектом Удара колосса).
Помните, что Безрассудство также увеличивает получаемый воином урон на 20%, поэтому использование способности в период, когда вы получаете урон, может закончиться не очень радостно для вас.
Внутренняя ярость . Позволяет использовать Удар героя чаще. Используется, чтобы слить лишнюю ярость в том случае, если одними Ударами героя этого не достичь.
Вихрь клинков . Дает хороший прирост в уроне, если применяется хотя бы к 3+ целям. В других случаях польза от него мала. Помните, что вы не можете использовать другие способности во время Вихря клинков.
Возмездие . Может быть использовано для дополнительного урона, если во время боя вара атакуют монстры.
Входящий урон уменьшен на 10%.
Традиционно основной стойкой для армс вара была Боевая стойка, но после бесчисленных изменений Боевая стойка стала нужна воину только для 4 способностей (и лишь одна из них используется постоянно):
- Кровопускание: обычно используйте в начале боя, так как потом обновляется Смертельным ударом.
- Сокрушительный бросок: обычно используйте в бою только раз.
- Удар грома: нужен только в АоЕ ситуациях, чтобы развесить Кровопускание на противников.
- Превосходство: используется примерно каждый 5 секунд.
Стойка берсерка дает армс вару дополнительные над Боевой стойкой 5% урона, но приходится часто переключаться в Боевую стойку для использования Превосходства.
В принципе, эти 5% играют не играю большой роли, но если вы хотите добиться максимально возможного урона – смена стоек будет обязательной. При смене стоек в бою, по приблизительным подсчетам, можно повысить дпс на 3-4%.
Самый простой способ эффективно использовать переключение между стойками – создать макросы на большинство используемых воином способностей. Цель таких макросов – упростить смену стоек, запуская их вместе с нужными ударами.
В боевой стойке вам нужно только Превосходство:
#showtooltip Превосходство /cast Боевая стойка /cast Превосходство
Остальные способности армс вару выгоднее использовать в стойке берсерка, поэтому макросы на них будут выглядеть, например, так:
#showtooltip Смертельный удар /cast Стойка берсерка /cast Смертельный удар
Создайте подобные макросы на все используемые способности, чтобы упростить себе смену стоек.
Использование Превосходства при смене стоек
Талант Вкус крови дает воину прок Превосходства с каждый тиком Кровопускания, но не чаще, чем раз в 5 секунд. Прок будет висеть 9 секунд, но нужно воспользоваться им в течение 5 секунд, чтобы успеть получить следующий прок.
В идеале, вам стоит оттягивать использование прока Превосходства до самого конца прока (до самой пятой секунды). Это позволит в конце прока переключиться в Боевую стойку, ударить Превосходством, тут же получить еще один прок, который сразу же использовать. После этого вы можете провести в стойке берсерка 8-9 секунд. То есть вы переключаетесь в Боевую стойку, 2 раза используете превосходство и возвращаетесь в стойку берсерка.
Такой вариант предпочтительнее, поскольку позволяет вам переключаться между стойками не раз в 5 секунд, а раз в 8-9 секунд. Вы нанесете и больше урона, поскольку больше времени проведете в стойке берсерка.
Бонусы рейдовых комплектов
Т12 (4.2):
- 2 части : Боевой и Командирский крик также увеличивают наносимый варом урон на 10% в течение 12 секунд.
- 4 части : применение способностей «Яростный выпад» и «Смертельный удар» с вероятность 30% вызовет дополнительную атаку, наносящую огнем 100% урон от оружия.
Т13 (4.3 и 4.3.4):
- 2 части : затраты ярости на Удар героя снижены на 10 единиц пока активна способность Внутренняя ярость.
- 4 части : Кровожадность и Смертельный удар могут наложить на цель эффект Удара колосса на 6 секунд с вероятностью соответственно 6% и 13%.
Надеемся, данный гайд по армс вару 4.3 поможет вам разобраться в тонкостях игры дд воином в Катаклизме и позволит улучшить ваши показатели в ПвЕ рейдах.
Всем привет! Сегодня я расскажу вам о Армс Варе в PVP и многое другое! Так что, уделите небольшую часть своего времени, и тем самым наберетесь достаточно полезной информацией!
Тут только мои размышления, и не берите близко к сердцу, и, пожалуйста не агритесь на это все:)
Вот есть вар, по сути дела истинный мили класс который должен наносить колоссальный урон. Раньше, начиная с классика бегая варом, Ты чувствовал себя уверенно, не боясь за свою жопу, т.е во время PVP Ты спокойно мог зарубить практически любого, конечно если “пряморукий”. И противники как-то сторонились воинов, у них был страх над классом (О! бежит вар лучше я подожду своих или обегу). Воин был настоящим воплощение силы! Раньше на БГ Армс Варом или Фури Варом Ты чувствовал себя “Почти Нагибатором”, конечно это чувство предавал скилл, хорошая команда и хил за спиной. Воина сторонились …
А что мы имеем сейчас – представим что мы на БГ бегаем Армс Варом, как всегда все толпой прут на толпу (я не про РПБ, там как раз используют разнообразные тактики) раньше если вар в толпе юзает вихрь клинков все сразу же бросались в бегство, а теперь залетаешь в толпу прыжком, используешь размашистые удары и вихрь клинков — крутишься… крутишься, а всем по-барабану возьмут и обезоружат или вовсе даже не успеешь до крутиться, убьют. Или представим другой случай, попался на пути Варлока, Армс Вар – воином ты его даже толком покоцать не успеешь как его питомец убьет тебя, а лок стоит и хилиться своим лучиком. Вообщем играть Армс Варом в PVP не торт. Конечно сейчас многие начнут троллить, типа, автор нуб, иди учись играть, вар всех дерет и т.д.
НО! Все же Армс Вар в умелых руках творит чудеса!
Вот об этом и будет мой гайд, и как же из перса для избиения, превратиться в нагибатора!?
Эх!… сильно сказал все таки, гайд лишь наставит вас на путь истинный, а руки соизвольте выпрямить сами себе!
Ну что же! Начнем!
PVP Билды на Армс Вара!
Тут взят талант Побуждение, но не взят талант Грубое прерывание. Билд предназначен для битв где не нужно часто сбивать каст противников!
Аналогичен предыдущему, только тут взят талант Грубое прерывание и вложено всего одно очко таланта на Полевые навыки. Билд Армса предназначает для игр где приходиться часто сбивать каст.
В этом билде на вара взят талант Умелый мощный удар, но не взят талант Побуждение.
Коротко о талантах:
Умелый мощный удар — очень полезен т.к есть свободное ГКД (Глобальный коулдаун)
Барабаны войны — ну талант так себе конечно зуботычина это хорошо, но затраты на другие менее полезные крики – это не рационально, потому что Пронзительный вой стал для армс вара всем – с помощью него мы стали выводить из стелса, ну и замедлять естественно, но все таки иногда не хватает ярости на Зуботычину . поэтому этот талант еще под вопросом…
Размашистые удары — не игнорируйте хороший и нужный талант особенно в замесе, ну и на арене он неплохо показал себя.
Грубое прерывание — дает отличный бафф увеличивающий дамаг на 5 %. Очень полезет когда бьетесь против кастеров.
Блиц — тоже хороший талант особенно для дефа своего партнера. Или при добивание когда противник рвется к своему хилу – бац и оба в стане. ..
Символы для Армс Вара PVP
Основные символы на воина :
Символ смертельного удара – стандарт
Символ вихря клинков — стандарт
Символ превосходства — стандарт
Большие символы на воина :
Символ рывка вдаль
Символ стремительного рывка
Символ отражения заклинания
Символ глухой обороны — конечно можно им заменить Символ отражения заклинания, но не советую т.к теперь бои на арене долгие.
Символ пронзительного воя — тоже можете заменить Символ отражения заклинания, но тут на ваше усмотрение.
Малые символы на воина :
Символ ярости берсека
Символ деморализующего крика
Символ боевого крика
Тут конечно же на ваше усмотрение.
PVP шмот на Армс Вара
Итак тут все просто! После того как ввели перековку, PVE обвес утратил свою актуальность. Получается весь шмот на устойчивость.
Аксессуары советую брать на использование, а не на прок т.к их можно юзануть в нужный момент, например при брусте.
Основные характеристики Армс Вара в PVP
Устойчивость — наверно самая важная характеристика в PVP! Ее нам нужно минимум 3700, для нормальной выживаемости.
Меткость — для PVP кап меткости составляет 5%
Мастерство — советую набирать больше 15%
Шанс критического удара — конечно крита у воинов совсем мало, хотя у нас есть Вкус крови, Побуждение, Безжалостность. Минимум — 7 % ниже не желательно.
Искусность — если честно сказать я как то забил на эту характеристику у меня ее около 9,5 и мне хватает, нечего выдающегося не было замечено, но может я ошибаюсь все таки 21 % экстра атаки не так заметны.
Сила — основная характеристика увеличивающая наш дамаг. Добираем ее с помощью сокетов.
Сокеты или Камни на Армс Вара
Красные — Рельефный инфернальный рубин
Желтый — Глянцевый угасающий топаз
Синий — Гравированное око демона
Особое — Рокочущий мглистый алмаз
Энчанты или зачарования воина
Голова : Магический знак изощренной силы
Плечи : Великое начертание изощренной силы
Грудь : Чары для нагрудника – все характеристики IX
Спина : Чары для плаща – критический удар II
Наручи : Чары для наручей – сила VI
Перчатки : Чары для перчаток – сила V
Пояс : Поясная пряжка из эбеновой стали
Ноги : Накладки для поножей из чешуи дракона
Ботинки : Чары для обуви – точность
Оружие : Обвал
Полезные бонусы профессий для Воина
Кожевничество : +130 к силе Драконье тиснение – сила
Кузнечное дело : +80 к силе 2хРельефный инфернальный рубин
Портняжное дело : Вышивка в виде рукояти меча
Ювелирное дело : +81 к силе Рельефный глаз химеры
Начертание : +80 силы Начертание львиной гривы
Наложение чар : +80 силы Чары для кольца – сила
Выбор за вами!
Макросы на вара
Я приведу лишь парочку необходимых макросов!
/закл Рывок(Боевая стойка)
Рывок по фокусу!
/закл Зуботычина
Сбиваем каст по фокусу!
/закл Смертельное спокойствие
/use Жетон победы яростного гладиатора (пвп аксессуар)
/закл Кровавое неистовство(Расовая) (если орк)
/закл Размашистые удары(Боевая стойка, стойка берсерка)
Макрос на большой дамаг (бруст)
/закл Отражение заклинания(Боевая стойка, оборонительная стойка)
/equip *название одноручного оружия*
/equip *название щита*
Ну, а это самый стандартный макрос который должен быть у всех воинов которые себя уважают.
Вот и добрались до самой интересной части нашего гайда по Армс Вара в PVP!
PVP Аспекты игры за вара / Cетапы
Так как все таки играть воином в PVP?! Спросите вы!
Я попытаюсь ответить на этот вопрос, конечно я докторскую диссертацию на данную тему не защищал и все рассказать не в силах, но постараюсь дать азы игры.
Нанесение урона Армс Варом
Ну тут все стандартно даже сам не знаю зачем решил описать все это, ну да ладно читайте на здоровье:
Выделяем нужную цель рывок, сразу же используем подрезаете сухожилия и вешаем кровопускание и бьем смертельным ударом, чтобы прокнул баф Избиение. Вновь повторяем подрезаете сухожилия и кровопускание в итоге получаем 3 стака Избиение. Затем бьем ударом колосса после него спамим смертельный удар и превосходство при избытке ярости используйте удар героя
Если нужно нанести сразу большой дамаг используйте смертельное спокойствие (+ расовые абилки и аксессуар)
Конечно тут я не все описал, да и описать все невозможно – это так набросок стандартных действий.
Анализ способностей противника
Я конечно забыл написать об обязательных аддонах для арены, но это не беда напишу ниже, а пока будем анализировать абилки наших противников.
Итак! для того чтобы успешно вести бой на арене, Армс Вару потребуется аддоны: gladius, icicle или afflicted.
С помощью этих аддонов, вы сможете наблюдать время перезарядки абилок и аксессуаров наших противников. Для чего это нам надо?
Знаем КД аксессуаров, рассовых способностей – с помощью которых противник может нанести бустовый дамаг или просейвиться. Конечно все это придет с опытом и вам уже не потребуются аддоны (как там говариться – набьете руку).Анализ способностей спасет вам жепу, ведь вы уже будите знать, что он может использовать тем самым вы спасете себе жизнь. (блин ну и написал одно и тоже только другими словами в одном предложение.) Короче вы уже будите знать когда че применить в ответ на их способности. (говарил же, что тут все словами не описать:))
Анализ оглушающих способностей . Поможет вам контролировать свободу действий. Если вы не знаете, на кд или нет стан противника вы уже не можете открыто действовать, потому- что в самый не нужный момент вас могут застанить (оглушить). В основном противник контролит вас или вашего напарника когда он сам при смерти или пытается добить вас. Конечно у нас есть ПВП аксессуар который поможет выбраться из стана, но все же помогает лишь 1 раз в две минуты.
Анализ контролирующих способностей . – способности которые не дают вам совершить каких либо действий. Например ослепление (блинк), дезориентирующий выстрел, замораживающая ловушка и т.д (о контролирующих способностях напишу чуть ниже) . Анализ нужен для того чтобы при добивание противника у вас всегда была на готове PVP тринька (аксессуар), чтоб быстро снять контроль и добить цель. Есть небольшая хитрость у Армс Вара, но почему то мало кто ее использует — Вмешательство накладывает заклинание на вашего напарника на 10 секунд (думайте сами)….
Рассредоточение на Арене.
Вот вы пытаетесь убить противника (юзанули бурст) и в самый неподходящий момент противник прерывает вашу котр-атаку. Причин этому множество. Лучше следить и анализировать и по возможности избегать таких недочетов.
Вот один из распространенных случаев (конечно вы подумаете что такого не может быть). Вы бьете колосом и косите по цели (уклон или пари) получается ваши абилки который нанося сильный урон – нанесут незначительный дамаг и добить цель не получиться. Чтобы избежать таких случайностей бейте колосом до применения основных бруст способностей или тогда когда вы полностью уверены в попадание. Конечно смешно – но в моей практике такое бывает часто.
Повторюсь еще раз — следите за контроль способностями и аксессуаром противника.
Сетапы Армс Вара
Сетапы 2х2 — это хороший показатель кайта, умения быстро убить цель, умение переиграть противника и показать настоящий скил!
Цель воина в 2х2 – это Выжать, с минимальными затратами защитных абилок, Заставлять противников использовать их защитные абилки, ДЕФИТЬ своего напарника, помогая ему пережить тунелинг и молниеносный дамаг, назовем это так.
1.1) Воин х ДЦ прист – Мощный сетап, в хороших и сыгранных руках. конечно в патче 4.3 выживаемость пристов поубавили.
1.2) Воин х Холи паладин – тоже сильный сетап, проблема этого сетапа Паладин много стоит в контроле, но зато у него резиновая мана.
1.3) Воин х Рестор шаман – наверное самый удачный вариант сетапа для воина. Отлично подходит для агрессивной игры.
1.4) Воин х Рестор друид – тоже отличный вариант, друль будет кайтить противника, вар мутозить – этакие бои на терпение.
Сетапы 3х3
1.1) Воин – ДК – Паладин(хил): вару нужно играть агресивно, часто меняя цели (как волченок туда, сюда, обратно- ахаха как больно) 🙂
Преимущества :
Можно разделять урон по противникам
Много защитных абилок
Есть возможность за один бурст убить противника.
Ваша уязвимость :
Предназначен не для долгих боев, часто контролят.
1.2) Воин – Прист – Паладин – (как там говориться в простонародье – Диспел клиф): Хороший сетап, возможность двух напарников лечить и диспелить, но есть проблемы против сетапов с двумя милишниками. Вообще стиль боя тут спокойный – приседаете к одному противнику и долбите его до победной.
Преимущества :
Возможность диспелить все подряд.
Большое количество защитных абилок, которые помогают переживать сильные атаки противников.
Уязвимость :
Всего один дамагер, если противники держат его постоянно в контроле, то дамага тю-тю.
Мало контролирующих способностей.
Долгий бой на терпеливость (либо вы задолбаетесь пилить противников, либо они задолбаются долбить вас и ваших лекарей).
1.3) Воин – ретро Паладин – Прист обычный мили клиф. Нанесение большого дамага и попеременное прерывание лечения противников.
Преимущества :
Высокий дамаг в одну цель, возможность снести сразу же одного противника
Достаточно мобильный сетап
Много контроля
Много защитных абилок
Возможность паладина спасти напарников в трудную минуту.
Уязвимость :
Приста будут контролить
Бафы пала будут рассеивать.
1.4) Воин – Хант- (и любой хил) – огромный туннельный дамаг в одну цель. ОТ вара требуется буст по команде охотника, а так в основном спокойная игра.
Преимущества :
Большой дамаг.
Много контроля, что помогает убить одну цель быстро.
Хант может успешно кайтить.
Уязвимость :
Незащищенный хил.
Под пресингом ханту не удобно.
1.5) Воин – Варлок – Шаман/Друид – очень сильный сетап.
Преимущества :
Уйма контроля, которое защищает весь сетап
Большая мобильность
Большой дамаг
Можно и тянуть время
Возможность агресивной и деф игры
Уязвимость :
Лока легко убить
При контроле вара, дамаг у лока незначительный.
Описывать все сэтапы не буду, лучше попробуйте сами!
2.1 Воин – Друид (ферал) – Паладин/Шаман (хилы) — сильный сетап, хороший контроль и сильный дамаг
2.2 Воин – Маг – Прист – отличный сетап аналог РМП, вот только вар менее мобильней роги, но зато вар крепче.
2.3 Воин – Шаман (энх) – Друид (хил) – Сильный дамаг, дополнительный хил, хорошая мобильность.
Ну и для закрепления всего материала, вот вам пару видео!
Вот и конец гайда по Армс Вару в PVP. Ну по крайней мере все, что можно описать словами я постарался описать, а вот скилл придет со временем. Бейтесь на арене и РПБ и на БГ – набирайтесь опыта, не отступайте перед трудностями! Удачи!
Танкование подземелий на 5 человек
Подземелья на 5 человек состоят из АоЕ-танкинга и быстро умирающих мобов, поэтому некоторые таланты становятся более привлекательными, чем другие.
Таланты, обозначенные желтым, являются обязательными, а оранжевые – необязательные, но крайне желательные. Таланты, которые не выделены никаким цветом, нас не интересуют.
Танкование в рейдах
В рейдах нас интересует выживание, полезные способности, а также иногда урон, который наносит танк.
Таланты, обозначенные желтым, являются обязательными, а оранжевые – необязательные, но крайне желательные. Таланты, которые не выделены никаким цветом, нас не интересуют, так как являются крайне слабыми или ситуационными.
Основные и малые символы для воина защиты довольно очевидны. Тем не менее, выбор больших символов зависит от вашего текущего энкаунтера.
Многие большие символы могут быть полезными, определенно выделить только три невозможно. Однозначно можно выделить Символ ударной волны . Среди остальных некоторые символы сильнее других, но все являются ситуационными. Выбирайте символы, которые будут полезны в каждой конкретной ситуации.
Данные символы можно использовать в качестве воина защиты. Единственное, Символ деморализующего крика является обязательным.
Атакующие способности
Ротация по одиночной целиРотация воина защиты построена вокруг Мощного удара щитом и таланта Щит и меч .
Ротация по нескольким целям
Для АоЕ-ситуаций не существует конкретной ротации. Оптимальный способ танкования нескольких мобов изменяется вместе с составом вашей группы, типом мобов и вашей раскладки талантов.
Базовой идеей является использование Рывка и/или Героического прыжка , затем нужно повесить Кровопускание и распространить его с помощью Удара грома . Используйте Ударную волну , когда это возможно. Реванш становится приоритетней, чем Мощный удар щитом , но последний стоит использовать, когда больше нечего.
Когда у вас много ярости (что случается намного чаще, чем при одиночной ротации), используйте Рассекающий удар . Он не тратит ГКД и не влияет на вашу ротацию.
Также не стоит забывать про полезные способности воина. Зуботычину и Отражение заклинания нужно применять как можно чаще, можно оглушать мобов с помощью Оглушающего удара , Обезоруживать или даже фирить с помощью Устрашающего крика . Не стоит недооценивать влияние Деморализующего крика на ваш урон. Активируйте его и поддерживайте, даже если мобы проживут совсем недолго.
Характеристики танков не работают таким же образом как у дд. Сложно дать точные цифры того или иного стата. Кратко: здесь будут представлен наиболее приемлемый приоритет характеристик и схемы гемминга, но альтернативные подходы могут быть не хуже. Для более подробной информации обращайтесь к разделу FAQ.
Искусность > Парирование = Уклонение > Мастерство > Меткость
Всегда ищите предметы с искусностью . Искусность наиболее эффективно снижает урон среди всех характеристик, делая это сглажено в отличии от уклонения и парирования.
Некоторые воины утверждают, что выносливость лучше, чем искусность. Одни говорят, что всегда лучше, другие — что только при полном покрытии таблицы боя (CTC, подробнее в FAQ ). Поэтому существует альтернативный вариант гемминга:
Что касается мета сокета, то вам следует использовать Вечный мглистый алмаз или Неограненный мглистый алмаз . Некоторые предпочитают второй камень, чтобы уменьшить разброс урона от неблокируемых атак, но первый камень уменьшит больше урона при более высоком уровне экипировки.
Вопрос : Что такое CTC?
Ответ : CTC – это аббревиатура для покрытия таблицы боя (Combat Table Coverage). Ваш CTC – сумма шанса промаха по вам, шанс уклонения, парирования и блока.
Люди часто обсуждают «полный СТС», то есть состояние, когда ни одна атака рейдового босса не достигает лучшего результата, чем блок. Полностью таблица боя покрывается на 102.4% СТС.
Вопрос : Таблица боя, как она работает?
Ответ : Каждый раз, когда NPC пытается вас атаковать, WoW ролит по таблице боя, чтобы проверить исход атаки.
Представим, что вы орк с 14% уклонения, 14% парирования и 50% блока, а также у вас вкачен талант Живая крепость . Когда босс пытается вас ударить, существует следующие исходы его атаки:
— Промах – 4,4%
— Уклонение – 13,4%
— Парирование – 13,4%
— Блок – 49,4%
— Попадание – 19,4%
Теперь представим, что вы увеличили шанс блока на 25% с помощью Блока щитом , тогда исход удара будет следующим:
— Промах – 4,4%
— Уклонение – 13,4%
— Парирование – 13,4%
— Блок – 68,8%
— Попадание – 0%
Как вы могли заметить, увеличение шанса блока на 25% полностью исключило шанс попадания по вам. В данный момент босс не сможет вас ударить. Здесь даже присутствует оверкап блока, так как вам бы было достаточно 19,4% блока, чтобы исключить попадание.
Почему было исключено 0,6% от каждого стата? За каждый уровень моба, превышающий ваш, все ваши защитные параметры уменьшаются на 0,2%. Так как рейдовый босс на 3 уровня старше вас, то каждая характеристика уменьшена на 0,6%. Именно поэтому вы полностью достигните СТС при 102,4%, а не при 100%.
Вам может быть интересно, где же критический блок в данной таблице? Его здесь нет, потому что он напрямую не зависит от работы таблицы боя. Когда происходит блокирование удара, у вас есть определенный шанс, что вы заблокируете двойной объем урона.
Вопрос: Что происходит с моими приоритетами характеристик, когда я достигаю капа блока? Мне и дальше стоит увеличивать количество искусности?
Ответ : И да, и нет. Искусность теряет примерно половину своей значимости после достижения полного СТС, но она все равно важна, так как увеличивает критический блок.
После 102,4% СТС уклонение и парирование будут иметь больший приоритет, чем искусность. Эти 2 характеристики также теряют значимость после прохождения СТС, но не в такой степени как искусность.
После набора 102,4% СТС многие воины решают изменить свои приоритеты. На практике это выливается в изменение схемы гемминга, выбор другой химии или набор «атакующих» характеристик. При перековке они перекачивают ненужные статы в уклонение и парирование вместо искусности.
Вопрос: Что такое диминишинг или убывающая эффективность?
Ответ : Диминишинг – это ситуация, когда при росте характеристик на одну и ту же величину, в определенный момент они начинают давать всё меньший и меньший эффект. Также существует диминишинг способностей, т.е. уменьшается эффективность способностей при их частом использовании подряд. В World of Warcraft парирование и уклонение подвержены диминишингу. Это означает, что каждое последующее очко рейтинга уклонения/парирования менее эффективно, чем предыдущее.
Рассмотрим пример. У вас есть 5% уклонения. Чтобы увеличить шанс уклонения ещё на 1% вам требуется 100 рейтинга уклонения (это не точные цифры, а лишь пример). А теперь у вас есть 15% уклонения. Но чтобы увеличить уклонения ещё на 1%, вам уже потребуется 200 рейтинга.
На практике это означает, что вам не нужно накапливать только парирование или только уклонение. Вместо этого стоит примерно уровнять их количество, чтобы минимизировать потери от диминишинга.
Примечания:
— Диминишинг не означает, что вы не можете парировать/уклоняться несколько раз подряд.
— Диминишинг не «включается» на определенных интервалах. Он действует постоянно и влияет на каждое отдельно очко рейтинга уклонения/парирования.
Вопрос: Парирование и уклонение действительно одинаково эффективны? И что можно сказать о таланте Дисциплина защитника ?
Ответ : И да, и нет. Наш талант Дисциплина защитника увеличивает ценность парирования, но из-за диминишинга оно быстро теряет свою преимущество по мере увеличения общего количества.
На практике это означает, что если у вас есть 18% парирования и только 12% уклонения, то вы теряете так много парирования из-за диминишинга, что даже талант Дисциплина защитника не компенсирует это.
Так сколько же парирования и уклонение нужно иметь? Большинство воинов защиты стараются набрать примерно на 20% больше рейтинга парирования, чем рейтинга уклонения под всеми баффами, но идеальное количество изменяется в зависимости от вашего шанса блока и того, сколько ударов вы получаете за секунду.
Пользователь Kolmagorov с mmo-champion.com создал график, по которому можно определить идеальное соотношение рейтинга парирования к рейтингу уклонения с учётом всех рейдовых баффов.
Вопрос: мне нужен список BiS-экипировки для моего воина. Он существует?
Ответ : Определенно нет. Потому что, кратко говоря, невозможно создать реальный BiS-набор для воина защиты.
Если говорить подробнее, то невозможно определить самую лучшую экипировку. Уменьшение урона – наша главная цель, но как и когда мы его уменьшаем, иногда более эффективно, чем насколькоp мы его уменьшаем. Думаю, многие согласятся, что много заблокированных атак легче/эффективней исцелять, чем несколько атак, которых вы избежали.
Сложности начинаются с боссов, которые используют механику с различными негативными эффектами при его ударах, тогда возрастает ценность парирования и уклонения. Также существуют бурст-фазы, которые также увеличивают ценность парирования и уклонения. Стоит также отметить, что в некоторых случаях меткость и мастерство играют важную роль в прохождении энкаунтера из-за механики или таймера бешенства босса.
Кроме того, одни и те же аксессуары могут быть крайне полезны на одном энкаунтере и вообще не дадут эффекта на другом.
Вопрос: Я новичок в танковании, и есть много вещей, в которых я не уверен. Можете рассказать об основных положениях.
Ответ : Давайте рассмотрим эти основные положения при танковании.
Движение :
— Атаки со спины могут промазать, но их нельзя парировать, уклониться или заблокировать.
— Если вы оказались далеко от вашей цели, то вы можете на полной скорости бежать по прямой к нему, но не оказывайтесь в ситуации, когда стоите к нему спиной.
— Мили дамагеры всегда будут атаковать босса со спины, чтобы избежать риска парирования их атак. Поэтому не нужно крутить босса после того, как вы стали на свою позицию.
— Считается, что моб находится спереди, если он стоит в 180 градусах перед вами. Осторожно, если моб зайдет за 90 градусов влево или вправо, то вы не сможете избегать его атак.
Защита :
— Уменьшение урона важно, но ещё более важно, чтобы входящий урон уменьшался сглажено и на определенное количество. Тогда вас легче хилить.
— Блок сокращает урон от атак ближнего боя на 30%, а парирование, уклонение и промахи – на 100%.
— Наша искусность, Критический блок , даёт шанс блоку быть критическим, тем самым он будет блокировать в 2 раза больше урона, то есть 60%.
— Вечный мглистый алмаз увеличивает уменьшения урона от блоков до 31%, а от критических блоков – до 62%.
— Отличная идея – использовать ваша защитные КД, когда рейд получает много урона. Тогда хилерам придется обращать меньше внимания на вас.
— Блок щитом начинает повышать вероятность критического блока после 100% СТС. Согласно описанию, данная способность может превратить больше 25% СТС в критический блок. Она превращает всё избежание урона после 100% СТС в критический блок.
Атака :
— Угроза и аггро – 2 разные вещи. Угроза – это то, что вы генерируете на моба, а моб будет иметь аггро против игрока с максимальной угрозой.
— Аггро изменяется, когда игрок превышает максимальную угрозу на 10%. Это работает для зоны ближнего боя, а для в дальнем бою предел составляет 30%.
— Провокация не генерирует никакой угрозы. Она мгновенно вызывает аггро моба на вас или даёт вам столько же угрозы, сколько было у аггро предыдущего игрока. Если вы будете таунтить при своём аггро, то ничего не произойдет.
— ДД генерируют 1 угрозу за каждый 1 урон. Хиллеры генерируют 0.5 угрозы за 1 пункт исцеления. Когда вы находитесь в стойке защиты, то генерируете 5 угрозы за 1 урон.
— Безрассудство решает проблемы с угрозой в начале боя.
Представляем вашему вниманию ПвЕ гайд по вару танку для патчей WoW 4.3 и 4.3.4. В данном гайде рассмотрены основные аспекты игры воином защиты (Protection Warrior) в Катаклизме: таланты, билд, ротация, основные способности, подбор экипировки.
Доступна более свежая версия гайда:
Изменения в 4.3 и 4.3.4
Несмотря на то, что ветки «Оружие» и «Неистовство» получили порцию изменений, наша ветка «Защита» осталось практически без изменений как в патче 4.3, так и в патче 4.3.2.
- (4.3) Применение нескольких способностей, накапливающих ярость, теперь приостанавливает спадение уровня ярости.
- (4.3) Исправлены баги, связанные с Рывком.
В последующих патчах 4.3.3 и 4.3.4 прот воин также не получил никаких изменений.
PvE аддоны
Рейдовые аддоны:
Другие полезные аддоны:
- / / — отслеживание баффов и дебаффов.
Больше полезных модификаций вы можете найти на странице « «.
Таланты/билд
Базовым набором талантов для ПвЕ танка является билд 2/0/25. Эти таланты являются основными и обязательны для всех вариаций билда.
*На картинке взяты опциональные таланты Побуждения и Охрана. Вкладывать оставшиеся очки именно в эти таланты не обязательно.
Танк вар имеет достаточно много опциональных пве талантов. Одни из них полезны в бою с одиночной целью, другие – для АоЕ, третьи пригодятся в некоторых ситуации.
Опциональные таланты :
Таланты для одной цели:
- 2/3 Побуждение . Существенно улучшает Удар героя, но это полезно только с точки зрения генерации угрозы и нанесения урона.
- 2/2 Безжалостность . Прямое повышение генерации угрозы и наносимого урона от улучшенного Удара щитом.
- 3/3 Военная наука . Повышение наносимого урона и генерации угрозы благодаря дополнительным 15% урона от Сокрушения.
- 3/3 Глубокие раны . Критические удары будут оставлять на противнике кровотечение, которое наносит урон в течение 6 секунд. Кровотечение висит на цели почти постоянно и в конечном итоге наносит значительное количество урона.
Наконец, если в бою в скором времени вы получите большое количество урона, имеет смысл сохранить Блок щитом до этого момента.
Глухая оборона , Ни шагу назад , Безудержное восстановление . Эти три способности имеют большое кд: 3-5 минут. Их использование во многом зависит от механики боя, и вам стоит координироваться с лекарями, чтобы определить наиболее подходящее время использования этих способностей.
Глухая оборона . Поскольку способность значительно снижает входящий урон, она должна использоваться в моменты, когда танк должен получить большую величину урона.
Ни шагу назад . Обычно используется, когда у танка остается мало здоровья, дабы мгновенно восстановить 30% от его запаса. Иногда способность применяется перед особо сильными ударами.
Безудержное восстановление . Так как величина лечения напрямую зависит от максимального запаса здоровья, Безудержное восстановление рекомендуется использовать одновременно с Ни шагу назад или под проком аксессуаров.
Бдительность . Дает два полезных бонуса:
- Обновляет кд Провокации каждый раз, когда противник атакует игрока, к которому применено Вмешательство.
- Дает вару Отмщение .
Генерация ярости
Если вы испытываете проблемы с генерацией ярости, вы можете использовать следующие способности:
- Используйте Ярость берсерка , чтобы получать вдвое больше ярости от входящего урона.
- Используйте Командирский / Боевой крик, чтобы накопить ярость.
- Безрассудство увеличивает входящий урон, но вместе с тем повышает и генерацию ярости.
Бонусы рейдовых комплектов
Т12 , Т13 (4.2 и 4.3 / 4.3.4, бонусы одинаковы):
- 2 предмета : способность Реванш также накладывает на танка щит, который поглощает 20% от нанесенного Реваншем урона.
- 4 предмета : 50% эффекта Глухой обороны также распространяются на всех союзников.
Надеемся, данный гайд по вару танку 4.3.4 поможет вам разобраться в механике игры воином защиты (прот варом) в Катаклизме 4.3 и позволит повысить ваши показатели в ПвЕ рейдах.
Представляем вашему вниманию ПвЕ гайд по воину ветки «Неистовство» для патча 4.3. В данном гайде рассмотрены все основные аспекты игры фури варом (Fury Warrior) в Катаклизме 4.3.4: таланты, билд, ротация, подбор экипировки и многое другое.
Доступна более свежая версия гайда: (Пандария)
Огромный дпс фури вара в 4.3.4:
Изменения в 4.3 и 4.3.4
В патче 4.3 ПвЕ фури вара коснулись следующие изменения:
- (4.3) Талант «Яростные атаки» отныне снижает поулчаемое целью исцеление на 25%, а не на 10%.
- (4.3) Пассивная способность «Специализация на бое с оружием в каждой руке» по-прежнему увеличивает урон от оружия в левой руке на 25%, но больше не повышает наносимый физический урон на 5%.
- (4.3) Анимация Удара колосса и Мощного удара подверглась изменениям.
В последующих патчах 4.3.2, 4.3.3 и 4.3.4 воин не получил значительных изменений.
PvE аддоны
Рейдовые аддоны:
Другие полезные аддоны:
- / / — отслеживание баффов и дебаффов.
Больше полезных модификаций вы можете найти на странице « «.
Таланты, билд
Хватка титана или Единство намерений
ПвЕ фури вар может использовать в бою либо два двуручных оружия (в этом случае берется талант Хватка титана), либо два одноручных оружия (в этом случае следует брать талант Единство намерений).
Оба варианта показывают примерно одинаковые результаты. Мы рекомендуем выбирать между этими стилями игры в зависимости от доступности воину того или иного оружия. Если средний уровень вашего одноручного оружия превосходит средний уровень двуручного – выбирайте Единство намерений. В других случаях выбирайте Хватку титана.
Билд
Одна цель
Ротация пве фури вара для одной цели в патче 4.3.4 очень проста. Самая основная вещь, которую вам стоит помнить – использование Кровожадности всегда, когда это возможно. Она имеет кд в три секунды, следовательно, каждые три секунды вы должны бить Кровожадностью.
Когда нет возможности использовать Кровожадность, вам следует придерживаться следующего списка приоритетов:
- Удар колосса . Используйте этот удар только в том случае, если в течение 6 секунд после него вы сможете использовать цикл Кровожадность – Яростный выпад – Кровожадность.
Гайд по армс(оружие) вару 5.4.8 пвп » Playing Games Servers
Содержание:
1. Таланты
2. Символы
3. Приоритет характеристик
4. Ротация
5. Камни/Инчат
6. Макросы
1. Таланты:
Рассмотрим подробнее каждый тир, который я предпочёл взять:
Тир 1Удвоенное время — наиболее выгодное и мобильное решения среди этих талантов.Тир 2Второе дыхание — как было в 5.2 и как в 5.4 так же наиболее выгодное и лучшее решение для вара. Т.к. невероятный отхил при 35% хп, невероятная выживаемость для вара. Обязательный талант для похода на арену.Тир 3Пронзительный вой — мобильный талант, т.к. он выводит противника из строя и не только одного, а несколько, к тому же любого, не специализируется на каком то определенном классе. Самый выгодный талант из этой тройки. Тир 4Вихрь клинков — Данный талант был не плохо апнут в 5.4, кд 1 минуту и дамаг увеличили, стоит задуматься о том что кд 1 минуту и легко заставить засейфиться противников, а это значить поставить свои сейфы на кд, к тому же не плохой дамаг, берём если входим на бг, или играем в команде с классом который умеет станить, контролить.Ударная волна — Так же актуально как и раньше, немного стала не такой вкусной как раньше, но всё же даёт Оглушение противнику и к тому же уменьшает кд если бьёт по 3 противникам, что не мало важно играет роль при том что кд у него и так 40 сек.Рев дракона — Вроде бы не очень любимый талант варов и вообще берут его в пве намного чаще, но стоит заметить что этот талант постоянно бьёт критом, т.е. крит 100%, если следить за проками и тринями и нашими пассивными талантами то можно нанести приличный урон.Тир 5Опять же таланты, которые нужно брать по разные виды игры:Массовое отражение заклинания — Стоит брать если вы идёте с хилом в арене или же в тиме где в основном тряпки или же грубо говоря нет лат. Его способность очень видна, когда вы её используете, что очень ухудшает его качество и его легко предугадать. Охрана — был лучшим талантов в начале пандарии, в основном он нужен что бы сбросить контроль и т.к. так же ещё актуален в аренах 2х2 т.к. порой попадают изащрёные тимы с «Адским» контролем.Бдительность — для арены 2х2 или чисто сейфить хила, кд 2 минуты, что не очень то радует, но при правильном обращении талантом, можно пережить бурст, спасти хила и втащить)Тир 6Аватара — в начале пандарии был самый лучший и вне конкуренции талант, т.к. имел на всё время использование имунитет ко всем контролям. В реалиях 5.4 стал не таким и громким, т.к. теперь можно только один раз выйти из контроля и всё, пропала та изюминка) Кровавая баня — Это дота, замедление цели и не плохой дамаг, не большой кд.Таланты мобильны и менять их нужно по разные тимы и игры.
2. Символы
Символ смертельного удара — +10% эффективности исцеления в Вас на 10 сек.
Символ приказания молчать — Героический удар и зуботычина накладывают на цель немоту на 3 секунды
Малые символы не играют большой роли.
Символ удара колосса — В китти кливе не используется. Зато используется в любом другом сетапе без ферала и совы. Очень сильно баффает туннельный дамаг. Если же вы играете в любом другом сетапе — меняется на символ Смертельного удара либо символ Бычьего натиска.
Символ бычьего натиска — Заменяет символ описанный выше. Очень сильно баффает рагонабор. Поможет вам против сетапов где вы постоянно сидите в деф стойке и испытываете затруднения в рагонаборе, но не столь критичном чтобы менять его на символ мортала или шв.
Символ замедляющих ударов — лучший выбор если вам не нужно ставить какой нибудь деф символ вроде символа Глухой Обороны.
Символ смерти с небес — Маст-хэв символ. Снижает кд вашего героик липа до 30 секунд. Еще больше баффает мобильность варов, позволяя им проводить больше времени на цели.
3. Приоритет характеристик
Мастерство (3%+) >= Меткость (3%) > Сила > Критический удар > Искусность > Скорость
PvP сила и PvP устойчивость. В связи с глобальными изменениями ПвП в патче 5.4 эти характеристики, похоже, уже не так эффективны, как прежде. Выгоднее собирать обычные второстепенные характеристики (скорость, искусность и т.д.). Но так же можно же всё же собрать некоторую часть фул капа: это будет 74%-75%Вставляем мето-камень на рес, чарку на грудь — устойчивость, + в 5.4 теперь есть бонус на 2600 устойчивости, если вы одеваете 2 PvP-тринькета. Средний показатель — 74-75% в фул pvp-эквипе. Меткость. Кап меткости для воина в Пандарии – 3% (1020 рейтинга меткости). Набор этого значения исключит промахи специальными (желтыми) атаками по другим игрокам. Мастерство. Определяет вероятность противников уклониться от ваших атак или парировать их. Софт кап мастерства в 5.4 – 3% или 1020 рейтинга мастерства (может быть меньше при налии расовых бонусов). Набор 3% мастерства исключит вероятность уклонения и парирования ваших атак кастерами. Дальнейший набор мастерства также возможен, но не обязателен – это зависит от вашего стиля игры.
Софт кап — 3% против кастеров (у них нет ни агилы, ни силы для парирование/уклонения)
Хард кап — процент, равны проценту пассивного парирования у силовика или уклону у ловкача (а это 20-25%), точной цифры, безусловно, нет, но как термин и как факт хард кап существует.
Т.е. 3% обязательно, 7.5% хардкап против ловкачей, силовиков, но опять же лишь термин и точной цифры нет, поэтому берём 3% и не паримся.
4. Ротация Некоторая ротация, которая лишь объясняет последовательность действия, но как показала практика, в бою всегда всё не предсказуемо, поэтому ротация всегда будет меняется, в зависимости от того как поведёт себя противник или вы.
Удар колосса — используем по откату и проку.
Смертельный удар — используем по откату.
Превосходство — используем по откату. Если доступен прок 56638 и Смертельный удар доступен, то Превосходство имеет выше приоритет, т.к. мы стараемся получить 5 стаков 56638.
Мощный удар — используем в промежутках, если Смертельный удар и Превосходство не доступны.
Удар героя — используется только под 85730 вместе с любыми вышеупомянутыми ударами, если НЕ ДОСТУПЕН прок 56638, в противном случае используем Превосходство чтобы получить пять стаков 56638 и только тогда разряжаем Удар героя.
56638 — разряжаем прок только под пять стаков или за 2–3 секунды до того как он спадет.
Рев дракона — используем по откату.
5. Камни/Инчат Особое гнездо Рокочущий изначальный алмаз / Деспотический изначальный алмаз Красное гнездо Покрытый письменами закатный оникс Синее гнездо Светозарный самородный нефрит / Прожигающий самородный нефрит Желтое гнездо Гладкий солнцесветИнчат: Плечи Великое начертание клыка тигра Спина +180 к крит. удару Грудь +80 ко всем характеристикам / +200 устойчивости Запястья +180 к силеКисти рук +170 к силе Пояс Поясная пряжка из живой стали Ноги Накладки из гневокожи Ступни +140 искусности Оружие Танцующая сталь
6. Макросы Макросы я использовал из инета, т.е. набрал в поисковике и в первом попашемся взял для себя, следовательно ничего своего не использую, ну это пока что, т.к. пока ничего не придумалось:Хочу отметить не плохие макросы, были найдены в сети: Макрос на Охрану или Вмешательство:
Код:
/showtooltip Охрана
/закл [target=мой_напарник]Охрана Макрос на Вмешательство в баннер
Код:
#showtooltip Издевательское знамя
/target Издевательское знамя
/cast Охрана
/targetlasttarget
/cast Издевательское знамя Макросы на смену оружия
Код:
#showtooltip Боевая стойка
/stopcast
/cast Боевая стойка
/equipslot 17 Большой меч злонравного гладиатора
/equipslot 16 Большой меч злонравного гладиатора
Макрос на отражение заклинанияКод:
#showtooltip Отражение заклинания
/equipslot 16 Большой меч злонравного гладиатора
/equipslot 17 Осадный щит злонравного гладиатора
/cast !Отражение заклинания
Макрос на Глухую оборону
Код:
#showtooltip Глухая оборона/закл Оборонительная стойка
/закл Глухая оборона
Макрос на ХПКод:
#showtooltip Ободряющий клич
#showtooltip Ободряющий клич
/закл Командирский крик
/закл Ободряющий клич Макрос на «Рублёвые фулы» Только тринкет и Кровавая баня
Код:
#showtooltip Кровавая баня
/use Жетон победы бездушного гладиатора
/закл Кровавая баня
Макрос «На все деньги» Все бурсты в одном макросе
Код:
#showtooltip Безрассудство
/закл Безрассудство
/закл Кровавая баня (либо Аватара)
/закл Знамя с черепом
/use Жетон победы бездушного гладиатора
/use Зелье силы могу (не действует на аренах и РБГ) Добавить в два верхних макроса «Ярость берсерка» — решать вам. Лично я привык подключать его вручную, для удобства контролировать проки. «+» в использовании ярости берсерка является то, что вы находитесь в состоянии иступления, в котором прокает «Яростный выпад».
Макрос на отмену различных аур
Вместо Кровожадности, вы можете использовать любую другу абилку.
Код:
#showtooltip Кровожадность
/закл Кровожадность
/cancelaura Длань защиты
/cancelaura Вихрь клинков
Макросы по фокусу
Код:
#showtooltip Рывок
/cast [target=focus, modifier:alt]Рывок; Рывок
Код:
#showtooltip Устрашающий крик
/cast [target=focus, modifier:alt]Устрашающий крик; Устрашающий крик
Код:
#showtooltip Зуботычина
/cast [target=focus, modifier:alt]Зуботычина; Зуботычина
Армс Вар 3.3.5 пвп гайд: билды, ротация, снаряжение
Руководство предназначено для игроков, которые хотят лучше понять класс Воина в спеке Оружие. Благодаря изученной информации удастся добиться хороших результатов на практике.
Билды на Армс Вара 3.3.5 пвп
Стандартное вооружение Воина. Орки могут тратить очки из Железной Воли в другое место. Сборка жизнеспособна на дуэлях и арене 2х2.
Вторая сборка ориентирована на нанесение урона, а не на живучесть. Эта сборка больше для арены 3х3 и полей битвы.
Ротация Армс Вара 3.3.5 пвп
Многие люди говорили, что Армс Вар в PvP не имеет ротации. Это не правда. Так воины организуют и контролируют выход урона. Вот как вы правильно наносите урон, и вот что должен знать каждый воин:
Hamstring/Piercing Howl —-> Rend —-> Mortal Strike —-> Overpower —-> Mortal Strike —-> Overpower ——> Mortal Strike —-> Overpower …так далее
Основными заклинаниями вращения консистенции здесь являются Mortal Strike и Overpower, Rend и Hamstring / Howl — дебаффы, которые вы поддерживаете постоянно. Когда срок действия дебаффа истекает, обновите его. Основными производителями урона являются MS и OP.
Вот эскиз приоритета наполнителей; производители дополнительного урона:
Heroic Throw > Mocking Blow > Heroic Strike > Thunderclap
Итоги:
- Основная ротация идет первой. Но наполнители, когда основные заклинания есть на CD.
- Rend, Mortal Strike и Slow должны быть ВСЕГДА. НИКОГДА не позволяйте им бежать. Если они не попадают в цель, применяйте их повторно, пока они не будут применены. Пронзительный вой помогает вместо подколенного сухожилия против мошенников и диких.
- Используйте Heroic Strike в качестве основного наполнителя, это добавляет огромное давление.
- Лучше всего использовать Thunderclap ТОЛЬКО, когда ваша ярость составляет 70-100 в качестве наполнителя.
- Вы можете начать с Героического Броска, если хотите, это не стоит ярости.
- Просто совет воинам, не связывайте свой HS с MS или OP.
Символы для Армс Вара 3.3.5 пвп
Большие символы
- Glyph of Mortal Strike – должен быть.
- Glyph of Rending – должен быть.
- Glyph of Overpower – лучший для дуэлей.
- Glyph of Bladestorm и Glyph of Sweeping Strikes – Часто принимаются на матчи Арены (выберите один).
- Glyph of Hamstring – Можно использовать везде, но если вы не хотите рисковать — используйте другие символы.
Малые символы
- Glyph of Bloodrage.
- Glyph of Charge.
- Glyph of Battle / Glyph of Command.
Бис Армс Вар 3.3.5 пвп
- Main Hand — Wrathful Gladiator’s Crusher (если возможно, то Shadowmourne )
- Ranged — Wrathful Gladiator’s Shotgun
- Chest — Wrathful Gladiator’s Plate Chestpiece
- Shoulders — Wrathful Gladiator’s Plate Shoulders
- Legs — Wrathful Gladiator’s Legguards
- Gauntlets — Wrathful Gladiator’s Plate Gauntlets
- Helm — Wrathful Gladiator’s Plate Helm
- Wrist — Wrathful Gladiator’s Bracer of Triumph
- Belt — Wrathful Gladiator’s Girdle of Triumph
- Boots — Wrathful Gladiator’s Greaves of Triumph
- Trinket 1 — Medallion of the Alliance (Если человек пойдет Shapened Twilight Scale )
- Trinket 2 — Deathbringer’s Will
- Ring 1 — Wrathful Gladiator’s Band of Triumph
- Ring 2 — Ashen Band of Endless Might
- Necklace — Wrathful Gladiator’s Pendant of Triumph
- Cloak — Wrathful Gladiator’s Cloak of Triumph
Камни Армс Вара 3.3.5 пвп
Красное гнездо — Fractured Cardinal Ruby / Bold cardinal Ruby
Синий сокет — Fractured Cardinal Ruby / Bold cardinal Ruby
Желтое гнездо — Fractured Cardinal Ruby / Bold cardinal Ruby
Мета — Chaotic Skyflare Diamond
Зачарки Армс Вара 3.3.5 пвп
Для одежды:
- Cloak — Enchant Cloak — Major Agility — +22 ловкость
- Belt – нет инчанта
- Boots — Enchant Boots — Tuskarr’s Vitality — +15 выносливость и скорость
- Bracer — Enchant Bracers — Greater Assault — +50 сила атаки
- Chest — Enchant Chest — Powerful Stats — +10 все характеристики
- Rings (Need to be an Enchanter) — Enchant Ring — Assault — +32 сила атаки
- Gloves — Enchant Gloves — Crusher — +44 сила атаки
- Helm — Arcanum of Torment — +50 Attack Power and +20 рейтинг критического удара
- Legs — Icescale Leg Armor — +75 сила атаки и +22 рейтинг критического удара
- Shoulders — Greater Inscription of the Axe — +40 сила атаки and +15 рейтинг крита
Для оружия:
Enchant Weapon – Берсерк
Профессии Армс Вара 3.3.5 пвп
Изучите профессии, которые значительно повысят ваши характеристики, такие как BSing + Ювелирное дело, или Портняжное дело + Ювелирное дело, как я, или Инженерное дело + Ювелирное дело или пошив одежды.
Ювелирное дело: дает вам возможность собрать 3 драгоценных камня только для JCer, которые дают большую статистику, чем обычные камни. Для воинов, которые будут 34 арпена от каждого драгоценного камня, масштабируясь до 102 арпен от всех 3, что на 32 арпена больше, чем от 3 обычных драгоценных камней. Кузнечное дело: дает вам возможность иметь две дополнительные розетки, 1 на запястье и 1 на руках. Портняжное дело: дает вам возможность зачаровать вашу спину с помощью чар, которые получают силу атаки 400 в течение 10 или 15 секунд (не помню). Инженерное дело: дает вам чар для рук, которые стреляют ракетами и наносят урон от 2к до 2.5к каждые 45 секунд. Также есть поясные бомбы, которые поражают цель на 3 секунды, и сапоги, которые значительно увеличивают вашу скорость бега на 3 секунды. Также возвращает вам чары, которые дают вам эффект парашюта при использовании. Хотя на арене можно использовать только ручные ракеты.Аддоны Армс Вара 3.3.5 пвп
Aesa: ОЧЕНЬ полезный аддон, простой в использовании и лучше IMO, чем Afflicted addon, и гораздо легче заметить, какие CD скоро будут готовы к вашей цели и вашему вниманию.
CombatLogFix: это необходимое дополнение для всех целей. Он исправляет боевой журнал и сбрасывает его, когда журнал перестает показывать историю произошедшего и выдает ошибки, как обычно в Molten. Кроме того, это позволяет работать с такими аддонами, как Aesa, без каких-либо проблем с вами. Получите этот аддон, это очень хорошо.
ErrorFilter: ДОЛЖЕН быть. Это для удаления раздражающей «цели вне диапазона» или любых глупых и раздражающих сообщений, которые обычно появляются, когда вы сражаетесь. Эти сообщения действительно раздражают игроков PvP, даже если звук отключен, красные сообщения на вашем экране заставляют вас терять правильную концентрацию в боях. Этот аддон удаляет такие сообщения. Также вы можете заблокировать любое сообщение, которое отображается в центре экрана, просто набрав «/ ef <точное сообщение, которое отображается на вашем экране>. Убедитесь, что вы печатаете сообщение точно так, как оно написано, с учетом строчных и прописных букв . Наслаждаться.
Гладиус: Кто не знает Гладиуса? кто их не использует? Если вы не являетесь пользователем этого аддона, у меня будут серьезные сомнения относительно вас как игрока на арене. Это ДОЛЖНО ИМЕТЬ аддон для всех любителей арены. Значительно помогает вам с более аккуратными блоками, облегчает их просмотр и отображает их компакт-диск с брелком для PvP, а также их характеристики и многое другое. Просто возьми это, сказал Нуфф.
LoseControl: Этот полезный аддон может быть оптимизирован для отображения больших значков на вашем юнфрейме, ваших партнерах, ваших врагах или вашем фокусе, когда они поражены любым видом CC. Т.е. … если вашего партнера боятся, он будет показывать значок страха рядом с его рамкой, показывающий на иконке таймер в виде часов, показывающий, сколько времени потребуется, чтобы закончить CC. Очень полезно. То же самое касается вас или вашей цели или фокуса.
OmniCC: это дополнение отображает таймер на любом из ваших дисков на панелях действий. На них ставится число того, сколько времени осталось в секундах или минутах, пока компакт-диск не будет готов. Помогает вам играть лучше и повышает вашу осведомленность о вещах. Должен иметь.
MoveAnything: Эта часть работы поразительна. С его помощью вы можете перемещать любую часть оригинального встроенного пользовательского интерфейса Blizz и размещать их в любом месте, или даже удалять любую часть пользовательского интерфейса. Например, если вы хотите переместить свой собственный кадр в любое место на экране, вы можете сделать это с помощью этого дополнения. Он перемещает фреймы, панели действий, партийные / целевые фреймы, интерфейс, панель позиции, возможно, даже баффы и дебаффы, а также мини-карту. Лично я использую это, чтобы скрыть кадры противоположной команды на арене, потому что это взаимодействует с кадрами Гладиуса и становится раздражающим.
NiceDamage: Вы когда-нибудь замечали, что стиль чисел в Blizz — хромать? Когда-нибудь чувствовали необходимость увидеть ваши криты в гораздо более удивительном стиле? Этот крошечный аддон заставляет вас никогда не уставать наносить урон. Вы будете благодарить меня много, когда вы используете это.
PlateBuffs: Это тот аддон, который мне понравился. Этот аддон улучшил мой стиль игры как минимум на 25%. Да … Это хорошо. ОЧЕНЬ, ОЧЕНЬ, ОЧЕНЬ классный аддон, который показывает ваши дебаффы на тарелках вашего врага и показывает таймер на них. Под «вражескими табличками» я подразумеваю ту, которая изображена прямо над вражеским персонажем, прямо над его головой. Вы можете включить это, нажимая ctrl + V в игре или alt + V, в зависимости от того, к какой клавише вы привязали <покажите вражеские таблички>. Это произведение искусства определенно сделало мои сражения проще и веселее. Он может быть оптимизирован для отображения дебаффов других игроков. Этот аддон, чтобы отслеживать ренд и смертельный удар по целям.
SnowFallKeyPress: Обычно, когда вы нажимаете кнопки в игре, заклинание гаснет, когда кнопка отпущена, а не при ее нажатии. Это решает проблему для вас и заставляет заклинания активироваться быстрее.
SoundAlerter: отличное дополнение, если не сказать больше. Этот аддон рассказывает о том, какие вражеские проигрыватели были разыграны и какие диски они использовали в звуке и чате. Как воин, я нашел это еще более полезным, когда он показывал мне предупреждения в чате о моих успешных прерываниях. В случае пропуска прерывания вы не увидите ни одного сообщения в чате, в противном случае будет указано, что вы ударили кого-то или избили. Также рассказывает о том, что мошенник или дикий ушел в стелс. Удивительный аддон и потрясающая работа. Определенно получите это.
DoomCoolDownPulse: это дополнение уведомляет вас, когда обновляется любой из ваших компакт-дисков. Большой значок обновленного компакт-диска появляется в центре экрана и через некоторое время исчезает, чтобы уведомить вас о готовности кулдауна.
Макросы для Армс Вара 3.3.5 пвп
Лучший Charge /Hamstring макрос:
#showtooltip charge
/startattack
/cast auto attack [harm]
/cancelaura Hand of protection
/cancelaura bladestorm
/cast charge
/cast hamstring
Перехват:
Intervene (Озарение):#showtooltip Intercept
/cancelaura Bladestorm
/cancelaura Hand of Protection
/startattack
/cast auto attack [harm]
/cast Intercept
/cast hamstring
#showtooltip Intervene
/cancelaura Bladestorm
/cancelaura Hand of Protection
/equip 1H wep Name
/equip Shield Name
/cast [@party1] intervene
Вы можете изменить «party1» на party2 или 3 или имя конкретного игрока, если хотите.
Отражение заклинания:
#showtooltip Spell reflection
/equip 1H wep Name
/equip Shield Name
/cast Spell Reflection
Берсерк:
/cancelaura [nomod] Enraged Regeneration
/cast [nomod] Berserker Rage
/cast [mod:shift] Enraged Regeneration
Это ОЧЕНЬ полезный макрос и эффективный против осколков крошки, страха покаяния, покаяния … вы называете это. Когда такие эффекты присутствуют на вас, когда вы вызываете ярость регенерации, вы не можете выдавать зерк, когда Реген активен, этот макрос решает проблему для вас.
Макрос оборонительной стойки :
/cast Defensive stance
/equip 1H wep name
/equip Shield Name
Обезоруживание:
/cast defensive stance
/cast disarm
Shield Bash (Удар щитом):
#showtooltip Shield Bash
/cancelaura Bladestorm
/equip 1H wep name
/equip Shield Name
/cast shield bash
Фокус Bash/Прерывание:
#showtooltip [equipped:Shields]Shield Bash;Pummel
/equip 1H wep Name
/equip Shield Name
/cast [@focus, exists] [stance:1/3,noequipped:Shields] Pummel
/cast [@focus, exists] [stance:1/2,equipped:Shields] Shield Bash
Фокус Charge/Прерывание:
/cast [@focus] Hamstring
/cast [@focus] charge
/cast [@focus] intercept
/cancelaura hand of freedom
/cancelaura Bladestorm
/cancelaura hand of protection
Heroic throw (Героический бросок):
/cast [nomod] Heroic throw
/cast [mod:shift] Shattering throw
Shield Slam (Мощный удар щитом):
#showtooltip shield slam
/equip 1H wep Name
/equip Shield Name
/cast Shield slam
Очень полезно, чтобы снять магический бафф с цели, такой как Sacred Shield.
Fear (Страх):
/cast Intimidating shout
/cancel sweeping strikes
Полезно, когда у вас есть эффект Sweeping Strikes, и вы хотите бояться сосредоточенности или чего-то еще и не хотите рисковать, чтобы сломить страх.
Руководство пользователя на ассемблере: MACRO и MEND
Эти две директивы определяют макрос. Синтаксис:
Использование
Если запустить любой WHILE...WEND
циклов
или IF...ENDIF
условий внутри макроса,
они должны быть закрыты до директивы MEND
достигается. Вы можете использовать MEXIT
, чтобы включить
ранний выход из макроса, например, изнутри цикла.
В теле макроса такие параметры, как $
, метка
$
или параметр
$
можно использовать так же, как и другие переменные.Им присваиваются новые значения при каждом вызове макроса. Параметры должны начинаться с cond
$
, чтобы отличить их от обычных символов. Любое количество параметров может
использоваться.
не является обязательной. Полезно, если макрос определяет
внутренние этикетки. Он рассматривается как параметр макроса. Это не обязательно
представляют собой первую инструкцию в расширении макроса. Макрос определяет расположение
любые этикетки. Метка $
Использовать |
в качестве аргумента для использования по умолчанию
значение параметра. Пустая строка используется, если аргумент
опущено.
В макросе, использующем несколько внутренних меток, полезно определить каждую внутреннюю метку как базовую метку с другим суффикс.
Используйте точку между параметром и последующим текстом или параметр, если в расширении не требуется пробел. Не используй точка между предыдущим текстом и параметром.
Для кодов условий можно использовать параметр $
.Использовать
унарный оператор cond
:REVERSE_CC:
для поиска обратного кода условия и :CC_ENCODING:
, чтобы найти 4-битную кодировку кода состояния.
Макросы определяют область действия локальных переменных.
Макросы могут быть вложенными.
Примеры
Макрос, использующий внутренние метки для реализации циклов:
; определение макроса МАКРО ; начать определение макроса $метка xmac $p1,$p2 ; код $метка.петля1 ; код ; код BGE $label.loop1 $метка.loop2 ; код БЛ $p1 BGT $label.loop2 ; код ADR $p2 ; код ИСПРАВИТЬ ; окончание определения макроса ; вызов макроса абв хмак субр1, де ; вызвать макрос ; код ; это то, что есть абклооп1 ; код ; производится, когда ; код ; макрос xmac BGE abcloop1 ; расширенный абклооп2 ; код BL subr1 BGT abcloop2 ; код ДОПОГ де ; код
Макрос, производящий диагностику во время сборки:
МАКРОС ; Определение макроса диагностировать $param1="по умолчанию" ; Этот макрос производит ИНФОРМАЦИЯ 0,"$param1" ; диагностика во время сборки ИСПРАВИТЬ ; (при втором проходе сборки) ; расширение макроса диагностировать; Печатает пустую строку во время сборки диагностировать "привет" ; Печатает «привет» во время сборки диагностировать | ; Печатает «по умолчанию» во время сборки
Когда переменные передаются в качестве аргументов, используйте |
может оставить некоторые переменные без замены.Чтобы обойти это,
определить |
в LCLS
или переменная GBLS
и передать эту переменную в качестве аргумента
вместо |. Например:
МАКРОС ; Определение макроса m2 $a,$b=r1,$c ; Значение по умолчанию для $b равно r1. добавить $a,$b,$c ; Макрос добавляет $b и $c и помещает результат в $a. ИСПРАВИТЬ ; Конец макроса МАКРО ; Определение макроса m1 $a,$b ; Этот макрос добавляет $b к r1 и помещает результат в $a.LCLS деф ; Объявите локальную строковую переменную для | НАБОРЫ "|" ; Определить | м2 $a,$def,$b ; Вызвать макрос m2 с помощью $def вместо | ; использовать значение по умолчанию для второго аргумента. ИСПРАВИТЬ ; Конец макроса
Макрос, использующий параметр кода условия:
AREA codx, КОД, ТОЛЬКО ДЛЯ ЧТЕНИЯ ; определение макроса МАКРО Возврат $конд [ {АРХИТЕКТУРА} <> "4" BX$конд л | MOV$cond pc,lr ] ИСПРАВИТЬ ; вызов макроса веселый ПРОК СМР r0,#0 MOVEQ r0,#1 Возврат эквалайзера ДВИГАТЕЛЬ r0, # 0 Возвращение ЭНДП КОНЕЦ
Предопределенные макросы компилятора
Платформенные зависимости
Если некоторые части кода зависят от платформы, протестируйте следующие определения препроцессора:
#если определено(__ПРИЛОЖЕНИЕ__)
#если определено(__linux__)
#если определено(__unix__)
#если определено(WIN32)
#если определено(__MINGW32__)
#если определено(__MINGW64__)
Чтобы проверить, не работает ли родной код на настольном компьютере:
#if (!(определено(__APPLE__) || определено(__linux__) || определено(__unix__))) \
|| определено (__DOXYGEN__)
Для проверки компилятора:
#если определено (__GNUC__)
#if __GNUC__ == 4 && __GNUC_MINOR__ == 7
#если определено(__clang__)
Чтобы проверить, только ли GCC:
#если определено(__GNUC__) && !defined(__clang__)
Чтобы проверить размер указателя:
#if __SIZEOF_POINTER__ == __SIZEOF_INT__
#elif __SIZEOF_POINTER__ == __SIZEOF_LONG__
#elif __SIZEOF_POINTER__ == __SIZEOF_LONG_LONG__
Чтобы проверить, нет ли long long переменных:
#если !определено(__SIZEOF_LONG_LONG)
Чтобы проверить, является ли модуль компиляции C++:
#если определено (__cplusplus)
Чтобы проверить, является ли единица компиляции файлом сборки:
#если определено(__ASSEMBLER__)
Чтобы проверить, включена ли оптимизация (более -O0
):
#если определено(__OPTIMIZE__)
Чтобы проверить, включена ли оптимизация размера ( -Os
):
#если определено(__OPTIMIZE_SIZE__)
Чтобы проверить, не включены ли встроенные строки:
#если определено(__NO_INLINE__)
Чтобы просмотреть встроенные определения:
$ g++ -dM -E - < /dev/null
$ clang++ -dM -E - < /dev/null
АРМ Кортекс-М
При компиляции приложений Cortex-M GCC 5.-]|версия|аби' | Сортировать # определить __ARMEL__ 1 #define __ARM_ARCH 6 #define __ARM_ARCH_6M__ 1 #define __ARM_ARCH_ISA_THUMB 1 #define __ARM_ARCH_PROFILE 77 #define __ARM_EABI__ 1 #define __ARM_PCS 1 #define __ARM_SIZEOF_MINIMAL_ENUM 1 #define __ARM_SIZEOF_WCHAR_T 4 #define __GXX_ABI_VERSION 1009 # определить __SOFTFP__ 1 #define __STDC_VERSION__ 201112L #define __THUMBEL__ 1 #define __THUMB_INTERWORK__ 1 #define __VERSION__ "5.4.1 20160919 (выпуск) [ARM/embedded-5-ветка, редакция 240496]" #define __VFP_FP__ 1 #define __рука__ 1 #define __thumb__ 1 $ .-]|версия|аби' | Сортировать # определить __ARMEL__ 1 #define __ARM_ARCH 6 #define __ARM_ARCH_6M__ 1 #define __ARM_ARCH_ISA_THUMB 1 #define __ARM_ARCH_PROFILE 77 #define __ARM_EABI__ 1 #define __ARM_PCS 1 #define __ARM_SIZEOF_MINIMAL_ENUM 1 #define __ARM_SIZEOF_WCHAR_T 4 #define __GXX_ABI_VERSION 1009 # определить __SOFTFP__ 1 #define __STDC_VERSION__ 201112L #define __THUMBEL__ 1 #define __THUMB_INTERWORK__ 1 #define __VERSION__ "5.4.1 20160919 (выпуск) [ARM/embedded-5-ветка, редакция 240496]" #define __VFP_FP__ 1 #define __рука__ 1 #define __thumb__ 1
ARM Cortex-M3
$.-]|версия|аби' | Сортировать
# определить __ARMEL__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 7
#define __ARM_ARCH_7M__ 1
#define __ARM_ARCH_EXT_IDIV__ 1
#define __ARM_ARCH_ISA_THUMB 2
#define __ARM_ARCH_PROFILE 77
#define __ARM_ASM_SYNTAX_UNIFIED__ 1
#define __ARM_EABI__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_IDIV 1
#define __ARM_FEATURE_LDREX 7
#define __ARM_FEATURE_QBIT 1
#define __ARM_FEATURE_SAT 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_PCS 1
#define __ARM_SIZEOF_MINIMAL_ENUM 1
#define __ARM_SIZEOF_WCHAR_T 4
#define __GXX_ABI_VERSION 1009
# определить __SOFTFP__ 1
#define __STDC_VERSION__ 201112L
#define __THUMBEL__ 1
#define __THUMB_INTERWORK__ 1
#define __VERSION__ "5.-]|версия|аби' | Сортировать
# определить __ARMEL__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 7
#define __ARM_ARCH_7EM__ 1
#define __ARM_ARCH_EXT_IDIV__ 1
#define __ARM_ARCH_ISA_THUMB 2
#define __ARM_ARCH_PROFILE 77
#define __ARM_ASM_SYNTAX_UNIFIED__ 1
#define __ARM_EABI__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_DSP 1
#define __ARM_FEATURE_IDIV 1
#define __ARM_FEATURE_LDREX 7
#define __ARM_FEATURE_QBIT 1
#define __ARM_FEATURE_SAT 1
#define __ARM_FEATURE_SIMD32 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_PCS 1
#define __ARM_SIZEOF_MINIMAL_ENUM 1
#define __ARM_SIZEOF_WCHAR_T 4
#define __GXX_ABI_VERSION 1009
# определить __SOFTFP__ 1
#define __STDC_VERSION__ 201112L
#define __THUMBEL__ 1
#define __THUMB_INTERWORK__ 1
#define __VERSION__ "5.-]|версия|аби' | Сортировать
# определить __ARMEL__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 7
#define __ARM_ARCH_7EM__ 1
#define __ARM_ARCH_EXT_IDIV__ 1
#define __ARM_ARCH_ISA_THUMB 2
#define __ARM_ARCH_PROFILE 77
#define __ARM_ASM_SYNTAX_UNIFIED__ 1
#define __ARM_EABI__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_DSP 1
#define __ARM_FEATURE_IDIV 1
#define __ARM_FEATURE_LDREX 7
#define __ARM_FEATURE_QBIT 1
#define __ARM_FEATURE_SAT 1
#define __ARM_FEATURE_SIMD32 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_FP 12
#define __ARM_PCS 1
#define __ARM_SIZEOF_MINIMAL_ENUM 1
#define __ARM_SIZEOF_WCHAR_T 4
#define __GXX_ABI_VERSION 1009
#define __STDC_VERSION__ 201112L
#define __THUMBEL__ 1
#define __THUMB_INTERWORK__ 1
#define __VERSION__ "5.-]|версия|аби' | Сортировать
# определить __ARMEL__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 7
#define __ARM_ARCH_7EM__ 1
#define __ARM_ARCH_EXT_IDIV__ 1
#define __ARM_ARCH_ISA_THUMB 2
#define __ARM_ARCH_PROFILE 77
#define __ARM_ASM_SYNTAX_UNIFIED__ 1
#define __ARM_EABI__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_DSP 1
#define __ARM_FEATURE_IDIV 1
#define __ARM_FEATURE_LDREX 7
#define __ARM_FEATURE_QBIT 1
#define __ARM_FEATURE_SAT 1
#define __ARM_FEATURE_SIMD32 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_FP 12
#define __ARM_PCS_VFP 1
#define __ARM_SIZEOF_MINIMAL_ENUM 1
#define __ARM_SIZEOF_WCHAR_T 4
#define __GXX_ABI_VERSION 1009
#define __STDC_VERSION__ 201112L
#define __THUMBEL__ 1
#define __THUMB_INTERWORK__ 1
#define __VERSION__ "5.-]|версия|аби' | Сортировать
# определить __ARMEL__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 7
#define __ARM_ARCH_7EM__ 1
#define __ARM_ARCH_EXT_IDIV__ 1
#define __ARM_ARCH_ISA_THUMB 2
#define __ARM_ARCH_PROFILE 77
#define __ARM_ASM_SYNTAX_UNIFIED__ 1
#define __ARM_EABI__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_DSP 1
#define __ARM_FEATURE_IDIV 1
#define __ARM_FEATURE_LDREX 7
#define __ARM_FEATURE_QBIT 1
#define __ARM_FEATURE_SAT 1
#define __ARM_FEATURE_SIMD32 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_PCS 1
#define __ARM_SIZEOF_MINIMAL_ENUM 1
#define __ARM_SIZEOF_WCHAR_T 4
#define __GXX_ABI_VERSION 1009
# определить __SOFTFP__ 1
#define __STDC_VERSION__ 201112L
#define __THUMBEL__ 1
#define __THUMB_INTERWORK__ 1
#define __VERSION__ "5.-]|версия|аби' | Сортировать
# определить __ARMEL__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 7
#define __ARM_ARCH_7EM__ 1
#define __ARM_ARCH_EXT_IDIV__ 1
#define __ARM_ARCH_ISA_THUMB 2
#define __ARM_ARCH_PROFILE 77
#define __ARM_ASM_SYNTAX_UNIFIED__ 1
#define __ARM_EABI__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_DSP 1
#define __ARM_FEATURE_IDIV 1
#define __ARM_FEATURE_LDREX 7
#define __ARM_FEATURE_QBIT 1
#define __ARM_FEATURE_SAT 1
#define __ARM_FEATURE_SIMD32 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_FP 12
#define __ARM_PCS 1
#define __ARM_SIZEOF_MINIMAL_ENUM 1
#define __ARM_SIZEOF_WCHAR_T 4
#define __GXX_ABI_VERSION 1009
#define __STDC_VERSION__ 201112L
#define __THUMBEL__ 1
#define __THUMB_INTERWORK__ 1
#define __VERSION__ "5.-]|версия|аби' | Сортировать
# определить __ARMEL__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 7
#define __ARM_ARCH_7EM__ 1
#define __ARM_ARCH_EXT_IDIV__ 1
#define __ARM_ARCH_ISA_THUMB 2
#define __ARM_ARCH_PROFILE 77
#define __ARM_ASM_SYNTAX_UNIFIED__ 1
#define __ARM_EABI__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_DSP 1
#define __ARM_FEATURE_IDIV 1
#define __ARM_FEATURE_LDREX 7
#define __ARM_FEATURE_QBIT 1
#define __ARM_FEATURE_SAT 1
#define __ARM_FEATURE_SIMD32 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_FP 12
#define __ARM_PCS_VFP 1
#define __ARM_SIZEOF_MINIMAL_ENUM 1
#define __ARM_SIZEOF_WCHAR_T 4
#define __GXX_ABI_VERSION 1009
#define __STDC_VERSION__ 201112L
#define __THUMBEL__ 1
#define __THUMB_INTERWORK__ 1
#define __VERSION__ "5.4.1 20160919 (выпуск) [ARM/embedded-5-ветвь, редакция 240496]"
#define __VFP_FP__ 1
#define __рука__ 1
#define __thumb2__ 1
#define __thumb__ 1
С плавающей запятой
Чтобы проверить, включена ли аппаратная плавающая точка ( -mfloat-abi=softfp
или -mfloat-abi=hard
):
Отдельностоящий
Чтобы проверить, был ли определен -ffreestanding
, вы можете использовать следующее:
#define __STDC_HOSTED__ 0
По умолчанию, т.е.е. с заданным -fhosted
значение равно 1.
Исключения C++
Чтобы проверить, скомпилирована ли программа на C++ с -fexceptions
, используйте:
Другие макросы
#define __CHAR_UNSIGNED__ 1
# определить __LP64__ 1
Предупреждения
При компиляции сторонних исходников может потребоваться временное отключение некоторых предупреждений:
#pragma Диагностическая отправка GCC
#pragma Диагностика GCC игнорируется "-Wpadded"
// ...
#pragma GCC диагностическое всплывающее окно
clang Специальные предупреждения должны выдаваться только для clang:
#pragma Диагностическая отправка GCC
#pragma Диагностика GCC игнорирует "-Wsign-conversion"
#если определено(__clang__)
Диагностика #pragma clang игнорируется "-Wgnu-include-next"
Диагностика #pragma clang игнорируется "-Wdisabled-macro-expansion"
Диагностика #pragma clang игнорирует "-Wmissing-variable-declarations"
Диагностика #pragma clang игнорируется "-Wexit-time-destructors"
#pragma clang диагностика игнорирует "-Wglobal-constructors"
#endif
// ...
#pragma GCC диагностическое всплывающее окно
Чтобы проверить, соответствует ли POSIX:
#include
#если определено(_POSIX_VERSION)
// ...
#endif
Для включения следующей версии:
#include
#если определено(_POSIX_VERSION)
#pragma Диагностическая отправка GCC
#если определено(__clang__)
Диагностика #pragma clang игнорируется "-Wgnu-include-next"
#endif
#include_next
#pragma GCC диагностическое всплывающее окно
#еще
// Избегайте предупреждений для определений __BSD*.#pragma GCC system_header
#ifdef __cplusplus
экстерн "С"
{
#endif
// ------------------------------------------------ ----------------------------
//...
// ------------------------------------------------ ----------------------------
#ifdef __cplusplus
}
#endif
#endif /* определено(_POSIX_VERSION) */
Макросы Ubuntu GCC
ilg@ubu20:~$ gcc --версия gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 Авторское право (C) 2019 Free Software Foundation, Inc. Это бесплатное программное обеспечение; см. источник условий копирования.Здесь нет гарантия; даже не для КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. ilg@ubu20:~$ gcc -E -dM - < /dev/null | Сортировать # определить __amd64 1 # определить __amd64__ 1 #define __ATOMIC_ACQ_REL 4 # определить __ATOMIC_ACQUIRE 2 #define __ATOMIC_CONSUME 1 #define __ATOMIC_HLE_ACQUIRE 65536 # определить __ATOMIC_HLE_RELEASE 131072 #define __ATOMIC_RELAXED 0 #define __ATOMIC_RELEASE 3 #define __ATOMIC_SEQ_CST 5 #define __BIGGEST_ALIGNMENT__ 16 #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #define __CET__ 3 #define __CHAR16_TYPE__ короткое целое число без знака #define __CHAR32_TYPE__ целое число без знака #define __CHAR_BIT__ 8 #define __code_model_small__ 1 #define __DBL_DECIMAL_DIG__ 17 #define __DBL_DENORM_MIN__ ((двойной)4.94065645841246544176568792868221372e-324L) #define __DBL_DIG__ 15 #define __DBL_EPSILON__ ((двойной)2.22044604925031308084726333618164062e-16L) #define __DBL_HAS_DENORM__ 1 #define __DBL_HAS_INFINITY__ 1 #define __DBL_HAS_QUIET_NAN__ 1 #define __DBL_MANT_DIG__ 53 #define __DBL_MAX_10_EXP__ 308 #define __DBL_MAX__ ((двойной)1.79769313486231570814527423731704357e+308L) #define __DBL_MAX_EXP__ 1024 #define __DBL_MIN_10_EXP__ (-307) #define __DBL_MIN__ ((двойной)2.2250738585072013830
9583289e-45F32 #define __FLT32_DIG__ 6 # определить __FLT32_EPSILON__ 1.171733240406e-308L) #define __DBL_MIN_EXP__ (-1021) #define __DEC128_EPSILON__ 1E-33DL #define __DEC128_MANT_DIG__ 34 #define __DEC128_MAX__ 9.9999999999999999999999999999999999E6144DL #define __DEC128_MAX_EXP__ 6145 #define __DEC128_MIN__ 1E-6143DL #define __DEC128_MIN_EXP__ (-6142) #define __DEC128_SUBNORMAL_MIN__ 0.00000000000000000000000000000000001E-6143DL #define __DEC32_EPSILON__ 1E-6DF #define __DEC32_MANT_DIG__ 7 # определить __DEC32_MAX__ 9.999999E96DF #define __DEC32_MAX_EXP__ 97 #define __DEC32_MIN__ 1E-95DF #define __DEC32_MIN_EXP__ (-94) #define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF #define __DEC64_EPSILON__ 1E-15DD #define __DEC64_MANT_DIG__ 16 #define __DEC64_MAX__ 9.999999999999999E384DD #define __DEC64_MAX_EXP__ 385 #define __DEC64_MIN__ 1E-383DD #define __DEC64_MIN_EXP__ (-382) #define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD #define __DEC_EVAL_METHOD__ 2 #define __DECIMAL_BID_FORMAT__ 1 #define __DECIMAL_DIG__ 21 # определить __ELF__ 1 #define __FINITE_MATH_ONLY__ 0 #define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ #define __FLT128_DECIMAL_DIG__ 36 #define __FLT128_DENORM_MIN__ 6.475175119438025110895822764655e-4966F128 # определить __FLT128_DIG__ 33 #define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 #define __FLT128_HAS_DENORM__ 1 #define __FLT128_HAS_INFINITY__ 1 #define __FLT128_HAS_QUIET_NAN__ 1 #define __FLT128_MANT_DIG__ 113 # определить __FLT128_MAX_10_EXP__ 4932 #define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 #define __FLT128_MAX_EXP__ 16384 #define __FLT128_MIN_10_EXP__ (-4931) #define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 #define __FLT128_MIN_EXP__ (-16381) #define __FLT32_DECIMAL_DIG__ 9 #define __FLT32_DENORM_MIN__ 1.401298464324817070
89550781250000000000000000000e-7F32 #define __FLT32_HAS_DENORM__ 1 #define __FLT32_HAS_INFINITY__ 1 #define __FLT32_HAS_QUIET_NAN__ 1 #define __FLT32_MANT_DIG__ 24 #define __FLT32_MAX_10_EXP__ 38 #define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32 # определить __FLT32_MAX_EXP__ 128 #define __FLT32_MIN_10_EXP__ (-37) #define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32 #define __FLT32_MIN_EXP__ (-125) #define __FLT32X_DECIMAL_DIG__ 17 #define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x # определить __FLT32X_DIG__ 15 #define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x #define __FLT32X_HAS_DENORM__ 1 #define __FLT32X_HAS_INFINITY__ 1 #define __FLT32X_HAS_QUIET_NAN__ 1 #define __FLT32X_MANT_DIG__ 53 #define __FLT32X_MAX_10_EXP__ 308 #define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x # определить __FLT32X_MAX_EXP__ 1024 #define __FLT32X_MIN_10_EXP__ (-307) #define __FLT32X_MIN__ 2.225073858507201383071733240406e-308F32x #define __FLT32X_MIN_EXP__ (-1021) #define __FLT64_DECIMAL_DIG__ 17 #define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64 #define __FLT64_DIG__ 15 #define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64 #define __FLT64_HAS_DENORM__ 1 #define __FLT64_HAS_INFINITY__ 1 #define __FLT64_HAS_QUIET_NAN__ 1 # определить __FLT64_MANT_DIG__ 53 #define __FLT64_MAX_10_EXP__ 308 #define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64 #define __FLT64_MAX_EXP__ 1024 #define __FLT64_MIN_10_EXP__ (-307) #define __FLT64_MIN__ 2.2250738585072013830
71733240406e-308F64 #define __FLT64_MIN_EXP__ (-1021) #define __FLT64X_DECIMAL_DIG__ 21 #define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x # определить __FLT64X_DIG__ 18 #define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x #define __FLT64X_HAS_DENORM__ 1 #define __FLT64X_HAS_INFINITY__ 1 #define __FLT64X_HAS_QUIET_NAN__ 1 #define __FLT64X_MANT_DIG__ 64 #define __FLT64X_MAX_10_EXP__ 4932 #define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x # определить __FLT64X_MAX_EXP__ 16384 #define __FLT64X_MIN_10_EXP__ (-4931) #define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x # определить __FLT64X_MIN_EXP__ (-16381) #define __FLT_DECIMAL_DIG__ 9 #define __FLT_DENORM_MIN__ 1.4012984643248170709583289e-45F # определить __FLT_DIG__ 6 #define __FLT_EPSILON__ 1.1
89550781250000000000000000000e-7F #define __FLT_EVAL_METHOD__ 0 #define __FLT_EVAL_METHOD_TS_18661_3__ 0 #define __FLT_HAS_DENORM__ 1 #define __FLT_HAS_INFINITY__ 1 #define __FLT_HAS_QUIET_NAN__ 1 # определить __FLT_MANT_DIG__ 24 #define __FLT_MAX_10_EXP__ 38 #define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F #define __FLT_MAX_EXP__ 128 #define __FLT_MIN_10_EXP__ (-37) #define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F #define __FLT_MIN_EXP__ (-125) #define __FLT_RADIX__ 2 # определить __FXSR__ 1 #define __GCC_ASM_FLAG_OUTPUTS__ 1 #define __GCC_ATOMIC_BOOL_LOCK_FREE 2 #define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 #define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 #define __GCC_ATOMIC_CHAR_LOCK_FREE 2 #define __GCC_ATOMIC_INT_LOCK_FREE 2 #define __GCC_ATOMIC_LLONG_LOCK_FREE 2 #define __GCC_ATOMIC_LONG_LOCK_FREE 2 #define __GCC_ATOMIC_POINTER_LOCK_FREE 2 #define __GCC_ATOMIC_SHORT_LOCK_FREE 2 #define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 #define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 #define __GCC_HAVE_DWARF2_CFI_ASM 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 #define __GCC_IEC_559 2 #define __GCC_IEC_559_COMPLEX 2 #define __GNUC__ 9 #define __GNUC_MINOR__ 3 #define __GNUC_PATCHLEVEL__ 0 #define __GNUC_STDC_INLINE__ 1 # определить __gnu_linux__ 1 #define __GXX_ABI_VERSION 1013 #define __has_include_next(STR) __has_include_next__(STR) #define __has_include(STR) __has_include__(STR) #define __HAVE_SPECULATION_SAFE_VALUE 1 #define __INT16_C(c) c #define __INT16_MAX__ 0x7fff #define __INT16_TYPE__ короткое целое #define __INT32_C(c) c #define __INT32_MAX__ 0x7ffffffff #define __INT32_TYPE__ целое число #define __INT64_C(c) c ## L #define __INT64_MAX__ 0x7ffffffffffffffffL #define __INT64_TYPE__ длинное целое #define __INT8_C(c) c # определить __INT8_MAX__ 0x7f #define __INT8_TYPE__ знаковый символ #define __INT_FAST16_MAX__ 0x7ffffffffffffffffL #define __INT_FAST16_TYPE__ длинное целое #define __INT_FAST16_WIDTH__ 64 #define __INT_FAST32_MAX__ 0x7ffffffffffffffffL #define __INT_FAST32_TYPE__ длинное целое #define __INT_FAST32_WIDTH__ 64 #define __INT_FAST64_MAX__ 0x7ffffffffffffffffL #define __INT_FAST64_TYPE__ длинное целое #define __INT_FAST64_WIDTH__ 64 # определить __INT_FAST8_MAX__ 0x7f #define __INT_FAST8_TYPE__ знаковый символ #define __INT_FAST8_WIDTH__ 8 #define __INT_LEAST16_MAX__ 0x7fff #define __INT_LEAST16_TYPE__ короткое целое #define __INT_LEAST16_WIDTH__ 16 #define __INT_LEAST32_MAX__ 0x7ffffffff #define __INT_LEAST32_TYPE__ целое число #define __INT_LEAST32_WIDTH__ 32 #define __INT_LEAST64_MAX__ 0x7ffffffffffffffffL #define __INT_LEAST64_TYPE__ длинное целое #define __INT_LEAST64_WIDTH__ 64 # определить __INT_LEAST8_MAX__ 0x7f #define __INT_LEAST8_TYPE__ знаковый символ #define __INT_LEAST8_WIDTH__ 8 #define __INT_MAX__ 0x7ffffffff #define __INTMAX_C(c) c ## L #define __INTMAX_MAX__ 0x7ffffffffffffffffL #define __INTMAX_TYPE__ длинное целое #define __INTMAX_WIDTH__ 64 #define __INTPTR_MAX__ 0x7ffffffffffffffffL #define __INTPTR_TYPE__ длинное целое #define __INTPTR_WIDTH__ 64 #define __INT_WIDTH__ 32 # определить __k8 1 # определить __k8__ 1 #define __LDBL_DECIMAL_DIG__ 21 #define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L #define __LDBL_DIG__ 18 #define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L #define __LDBL_HAS_DENORM__ 1 #define __LDBL_HAS_INFINITY__ 1 #define __LDBL_HAS_QUIET_NAN__ 1 #define __LDBL_MANT_DIG__ 64 #define __LDBL_MAX_10_EXP__ 4932 #define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L #define __LDBL_MAX_EXP__ 16384 #define __LDBL_MIN_10_EXP__ (-4931) #define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L #define __LDBL_MIN_EXP__ (-16381) # определить __linux 1 # определить __linux__ 1 # определить линукс 1 # определить __LONG_LONG_MAX__ 0x7ffffffffffffffffLL #define __LONG_LONG_WIDTH__ 64 #define __LONG_MAX__ 0x7ffffffffffffffffL #define __LONG_WIDTH__ 64 # определить __LP64__ 1 # определить _LP64 1 #define __MMX__ 1 #define __NO_INLINE__ 1 #define __ORDER_BIG_ENDIAN__ 4321 #define __ORDER_LITTLE_ENDIAN__ 1234 #define __ORDER_PDP_ENDIAN__ 3412 #define __pic__ 2 #define __PIC__ 2 #define __pie__ 2 #define __PIE__ 2 #define __PRAGMA_REDEFINE_EXTNAME 1 #define __PTRDIFF_MAX__ 0x7ffffffffffffffffL #define __PTRDIFF_TYPE__ длинное целое #define __PTRDIFF_WIDTH__ 64 #define __REGISTER_PREFIX__ # определить __SCHAR_MAX__ 0x7f #define __SCHAR_WIDTH__ 8 # определить __SEG_FS 1 #define __SEG_GS 1 #define __SHRT_MAX__ 0x7fff # определить __SHRT_WIDTH__ 16 #define __SIG_ATOMIC_MAX__ 0x7ffffffff #define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) #define __SIG_ATOMIC_TYPE__ целое число # определить __SIG_ATOMIC_WIDTH__ 32 #define __SIZE_MAX__ 0xffffffffffffffffUL #define __SIZEOF_DOUBLE__ 8 #define __SIZEOF_FLOAT128__ 16 #define __SIZEOF_FLOAT__ 4 #define __SIZEOF_FLOAT80__ 16 #define __SIZEOF_INT128__ 16 #define __SIZEOF_INT__ 4 #define __SIZEOF_LONG__ 8 #define __SIZEOF_LONG_DOUBLE__ 16 #define __SIZEOF_LONG_LONG__ 8 #define __SIZEOF_POINTER__ 8 #define __SIZEOF_PTRDIFF_T__ 8 #define __SIZEOF_SHORT__ 2 #define __SIZEOF_SIZE_T__ 8 #define __SIZEOF_WCHAR_T__ 4 #define __SIZEOF_WINT_T__ 4 #define __SIZE_TYPE__ длинное целое число без знака #define __SIZE_WIDTH__ 64 #define __SSE__ 1 #define __SSE2__ 1 #define __SSE2_MATH__ 1 #define __SSE_MATH__ 1 #define __SSP_STRONG__ 3 # определить __STDC__ 1 #define __STDC_HOSTED__ 1 #define __STDC_IEC_559__ 1 #define __STDC_IEC_559_COMPLEX__ 1 # определить __STDC_ISO_10646__ 201706L # определить _STDC_PREDEF_H 1 #define __STDC_UTF_16__ 1 #define __STDC_UTF_32__ 1 #define __STDC_VERSION__ 201710L #define __UINT16_C(c) c #define __UINT16_MAX__ 0xffff #define __UINT16_TYPE__ короткое целое число без знака #define __UINT32_C(c) c ## U #define __UINT32_MAX__ 0xffffffffU #define __UINT32_TYPE__ беззнаковое целое число #define __UINT64_C(c) c ## UL #define __UINT64_MAX__ 0xffffffffffffffffUL #define __UINT64_TYPE__ длинное целое число без знака #define __UINT8_C(c) c #define __UINT8_MAX__ 0xff #define __UINT8_TYPE__ беззнаковый символ #define __UINT_FAST16_MAX__ 0xffffffffffffffffffUL #define __UINT_FAST16_TYPE__ длинное целое число без знака # определить __UINT_FAST32_MAX__ 0xffffffffffffffffUL #define __UINT_FAST32_TYPE__ длинное целое число без знака # определить __UINT_FAST64_MAX__ 0xffffffffffffffffUL #define __UINT_FAST64_TYPE__ длинное целое число без знака #define __UINT_FAST8_MAX__ 0xff #define __UINT_FAST8_TYPE__ беззнаковый символ #define __UINT_LEAST16_MAX__ 0xffff #define __UINT_LEAST16_TYPE__ короткое целое число без знака #define __UINT_LEAST32_MAX__ 0xffffffffU #define __UINT_LEAST32_TYPE__ беззнаковое целое число #define __UINT_LEAST64_MAX__ 0xffffffffffffffffffUL #define __UINT_LEAST64_TYPE__ длинное целое число без знака #define __UINT_LEAST8_MAX__ 0xff #define __UINT_LEAST8_TYPE__ символ без знака #define __UINTMAX_C(c) c ## UL #define __UINTMAX_MAX__ 0xffffffffffffffffUL #define __UINTMAX_TYPE__ длинное целое число без знака #define __UINTPTR_MAX__ 0xffffffffffffffffUL #define __UINTPTR_TYPE__ длинное целое число без знака # определить __unix 1 # определить __unix__ 1 # определить unix 1 #define __USER_LABEL_PREFIX__ #define __VERSION__ "9.3,0 дюйма #define __WCHAR_MAX__ 0x7ffffffff #define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) #define __WCHAR_TYPE__ целое число #define __WCHAR_WIDTH__ 32 #define __WINT_MAX__ 0xffffffffU #define __WINT_MIN__ 0U #define __WINT_TYPE__ беззнаковое целое число #define __WINT_WIDTH__ 32 # определить __x86_64 1 # определить __x86_64__ 1 ilg@ubu20:~$Макросы Apple clang
ilg@wks ~ % gcc --версия Настроено с помощью: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.SDK/USR/включить/С++/4.2.1 Apple clang версии 12.0.0 (clang-1200.0.32.28) Цель: x86_64-apple-darwin20.2.0 Модель потока: posix Каталог установки: /Library/Developer/CommandLineTools/usr/bin ilg@wks ~ % gcc -E -dM - < /dev/null # определить _LP64 1 #define __APPLE_CC__ 6000 #define __ПРИЛОЖЕНИЕ__ 1 # определить __ATOMIC_ACQUIRE 2 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_CONSUME 1 #define __ATOMIC_RELAXED 0 #define __ATOMIC_RELEASE 3 #define __ATOMIC_SEQ_CST 5 #define __BIGGEST_ALIGNMENT__ 16 #define __BLOCKS__ 1 #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #define __CHAR16_TYPE__ короткий без знака #define __CHAR32_TYPE__ целое число без знака #define __CHAR_BIT__ 8 #define __CLANG_ATOMIC_BOOL_LOCK_FREE 2 #define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 2 #define __CLANG_ATOMIC_CHAR32_T_LOCK_FREE 2 #define __CLANG_ATOMIC_CHAR_LOCK_FREE 2 #define __CLANG_ATOMIC_INT_LOCK_FREE 2 #define __CLANG_ATOMIC_LLONG_LOCK_FREE 2 #define __CLANG_ATOMIC_LONG_LOCK_FREE 2 #define __CLANG_ATOMIC_POINTER_LOCK_FREE 2 #define __CLANG_ATOMIC_SHORT_LOCK_FREE 2 #define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 2 #define __CONSTANT_CFSTRINGS__ 1 #define __DBL_DECIMAL_DIG__ 17 #define __DBL_DENORM_MIN__ 4.9406564584124654e-324 #define __DBL_DIG__ 15 #define __DBL_EPSILON__ 2.2204460492503131e-16 #define __DBL_HAS_DENORM__ 1 #define __DBL_HAS_INFINITY__ 1 #define __DBL_HAS_QUIET_NAN__ 1 #define __DBL_MANT_DIG__ 53 #define __DBL_MAX_10_EXP__ 308 #define __DBL_MAX_EXP__ 1024 #define __DBL_MAX__ 1.7976931348623157e+308 #define __DBL_MIN_10_EXP__ (-307) #define __DBL_MIN_EXP__ (-1021) #define __DBL_MIN__ 2.2250738585072014e-308 #define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__ #define __DYNAMIC__ 1 #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 110000 #define __FINITE_MATH_ONLY__ 0 #define __FLT16_DECIMAL_DIG__ 5 #define __FLT16_DENORM_MIN__ 5.96046447753
e-8F16 #define __FLT16_DIG__ 3 #define __FLT16_EPSILON__ 9.765625e-4F16 #define __FLT16_HAS_DENORM__ 1 #define __FLT16_HAS_INFINITY__ 1 #define __FLT16_HAS_QUIET_NAN__ 1 #define __FLT16_MANT_DIG__ 11 #define __FLT16_MAX_10_EXP__ 4 #define __FLT16_MAX_EXP__ 16 # определить __FLT16_MAX__ 6.5504e+4F16 #define __FLT16_MIN_10_EXP__ (-4) #define __FLT16_MIN_EXP__ (-13) # определить __FLT16_MIN__ 6.103515625e-5F16 #define __FLT_DECIMAL_DIG__ 9 #define __FLT_DENORM_MIN__ 1.40129846e-45F # определить __FLT_DIG__ 6 #define __FLT_EPSILON__ 1.1
90e-7F #define __FLT_EVAL_METHOD__ 0 #define __FLT_HAS_DENORM__ 1 #define __FLT_HAS_INFINITY__ 1 #define __FLT_HAS_QUIET_NAN__ 1 # определить __FLT_MANT_DIG__ 24 #define __FLT_MAX_10_EXP__ 38 #define __FLT_MAX_EXP__ 128 #define __FLT_MAX__ 3.40282347e+38F #define __FLT_MIN_10_EXP__ (-37) #define __FLT_MIN_EXP__ (-125) #define __FLT_MIN__ 1.17549435e-38F #define __FLT_RADIX__ 2 # определить __FXSR__ 1 #define __GCC_ASM_FLAG_OUTPUTS__ 1 #define __GCC_ATOMIC_BOOL_LOCK_FREE 2 #define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 #define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 #define __GCC_ATOMIC_CHAR_LOCK_FREE 2 #define __GCC_ATOMIC_INT_LOCK_FREE 2 #define __GCC_ATOMIC_LLONG_LOCK_FREE 2 #define __GCC_ATOMIC_LONG_LOCK_FREE 2 #define __GCC_ATOMIC_POINTER_LOCK_FREE 2 #define __GCC_ATOMIC_SHORT_LOCK_FREE 2 #define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 #define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 #define __GNUC_MINOR__ 2 #define __GNUC_PATCHLEVEL__ 1 #define __GNUC_STDC_INLINE__ 1 #define __GNUC__ 4 #define __GXX_ABI_VERSION 1002 #define __INT16_C_SUFFIX__ #define __INT16_FMTd__ "hd" #define __INT16_FMTi__ "привет" #define __INT16_MAX__ 32767 #define __INT16_TYPE__ короткий #define __INT32_C_SUFFIX__ #define __INT32_FMTd__ "д" #define __INT32_FMTi__ "i" #define __INT32_MAX__ 2147483647 #define __INT32_TYPE__ целое число #define __INT64_C_SUFFIX__ LL #define __INT64_FMTd__ "lld" #define __INT64_FMTi__ "лли" #define __INT64_MAX__72036854775807LL #define __INT64_TYPE__ длинное длинное целое #define __INT8_C_SUFFIX__ #define __INT8_FMTd__ "hhd" #define __INT8_FMTi__ "привет" #define __INT8_MAX__ 127 #define __INT8_TYPE__ знаковый символ #define __INTMAX_C_SUFFIX__ L #define __INTMAX_FMTd__ "ld" #define __INTMAX_FMTi__ "ли" #define __INTMAX_MAX__
72036854775807L #define __INTMAX_TYPE__ длинное целое #define __INTMAX_WIDTH__ 64 #define __INTPTR_FMTd__ "ld" #define __INTPTR_FMTi__ "ли" #define __INTPTR_MAX__
72036854775807L #define __INTPTR_TYPE__ длинное целое #define __INTPTR_WIDTH__ 64 #define __INT_FAST16_FMTd__ "hd" #define __INT_FAST16_FMTi__ "привет" #define __INT_FAST16_MAX__ 32767 #define __INT_FAST16_TYPE__ короткий #define __INT_FAST32_FMTd__ "д" #define __INT_FAST32_FMTi__ "i" #define __INT_FAST32_MAX__ 2147483647 #define __INT_FAST32_TYPE__ целое число #define __INT_FAST64_FMTd__ "lld" #define __INT_FAST64_FMTi__ "лли" #define __INT_FAST64_MAX__
72036854775807LL #define __INT_FAST64_TYPE__ длинное длинное целое #define __INT_FAST8_FMTd__ "hhd" #define __INT_FAST8_FMTi__ "привет" #define __INT_FAST8_MAX__ 127 #define __INT_FAST8_TYPE__ знаковый символ #define __INT_LEAST16_FMTd__ "hd" #define __INT_LEAST16_FMTi__ "привет" #define __INT_LEAST16_MAX__ 32767 #define __INT_LEAST16_TYPE__ короткий #define __INT_LEAST32_FMTd__ "д" #define __INT_LEAST32_FMTi__ "i" #define __INT_LEAST32_MAX__ 2147483647 #define __INT_LEAST32_TYPE__ целое число #define __INT_LEAST64_FMTd__ "lld" #define __INT_LEAST64_FMTi__ "лли" #define __INT_LEAST64_MAX__
72036854775807LL #define __INT_LEAST64_TYPE__ длинное длинное целое #define __INT_LEAST8_FMTd__ "hhd" #define __INT_LEAST8_FMTi__ "привет" #define __INT_LEAST8_MAX__ 127 #define __INT_LEAST8_TYPE__ знаковый символ #define __INT_MAX__ 2147483647 #define __LDBL_DECIMAL_DIG__ 21 #define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L #define __LDBL_DIG__ 18 #define __LDBL_EPSILON__ 1.08420217248550443401e-19L #define __LDBL_HAS_DENORM__ 1 #define __LDBL_HAS_INFINITY__ 1 #define __LDBL_HAS_QUIET_NAN__ 1 #define __LDBL_MANT_DIG__ 64 #define __LDBL_MAX_10_EXP__ 4932 #define __LDBL_MAX_EXP__ 16384 #define __LDBL_MAX__ 1.18973149535723176502e+4932L #define __LDBL_MIN_10_EXP__ (-4931) #define __LDBL_MIN_EXP__ (-16381) #define __LDBL_MIN__ 3.36210314311209350626e-4932L #define __LITTLE_ENDIAN__ 1 #define __LONG_LONG_MAX__
72036854775807LL #define __LONG_MAX__
72036854775807L # определить __LP64__ 1 #define __MACH__ 1 #define __MMX__ 1 #define __NO_INLINE__ 1 #define __NO_MATH_INLINES 1 #define __OBJC_BOOL_IS_BOOL 0 #define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3 #define __OPENCL_MEMORY_SCOPE_DEVICE 2 #define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4 #define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1 #define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0 #define __ORDER_BIG_ENDIAN__ 4321 #define __ORDER_LITTLE_ENDIAN__ 1234 #define __ORDER_PDP_ENDIAN__ 3412 #define __PIC__ 2 # определить __POINTER_WIDTH__ 64 #define __PRAGMA_REDEFINE_EXTNAME 1 #define __PTRDIFF_FMTd__ "ld" #define __PTRDIFF_FMTi__ "ли" #define __PTRDIFF_MAX__
72036854775807L #define __PTRDIFF_TYPE__ длинное целое #define __PTRDIFF_WIDTH__ 64 #define __REGISTER_PREFIX__ #define __SCHAR_MAX__ 127 # определить __SEG_FS 1 #define __SEG_GS 1 # определить __SHRT_MAX__ 32767 #define __SIG_ATOMIC_MAX__ 2147483647 # определить __SIG_ATOMIC_WIDTH__ 32 #define __SIZEOF_DOUBLE__ 8 #define __SIZEOF_FLOAT__ 4 #define __SIZEOF_INT128__ 16 #define __SIZEOF_INT__ 4 #define __SIZEOF_LONG_DOUBLE__ 16 #define __SIZEOF_LONG_LONG__ 8 #define __SIZEOF_LONG__ 8 #define __SIZEOF_POINTER__ 8 #define __SIZEOF_PTRDIFF_T__ 8 #define __SIZEOF_SHORT__ 2 #define __SIZEOF_SIZE_T__ 8 #define __SIZEOF_WCHAR_T__ 4 #define __SIZEOF_WINT_T__ 4 #define __SIZE_FMTX__ "lX" #define __SIZE_FMTo__ "ло" #define __SIZE_FMTu__ "лу" #define __SIZE_FMTx__ "лк" #define __SIZE_MAX__ 18446744073709551615UL #define __SIZE_TYPE__ длинное целое число без знака #define __SIZE_WIDTH__ 64 #define __SSE2_MATH__ 1 #define __SSE2__ 1 #define __SSE3__ 1 #define __SSE4_1__ 1 #define __SSE_MATH__ 1 #define __SSE__ 1 #define __SSP__ 1 #define __SSSE3__ 1 #define __STDC_HOSTED__ 1 #define __STDC_NO_THREADS__ 1 #define __STDC_UTF_16__ 1 #define __STDC_UTF_32__ 1 #define __STDC_VERSION__ 201112L # определить __STDC__ 1 #define __UINT16_C_SUFFIX__ #define __UINT16_FMTX__ "hX" #define __UINT16_FMTo__ "хо" #define __UINT16_FMTu__ "ху" #define __UINT16_FMTx__ "чх" #define __UINT16_MAX__ 65535 #define __UINT16_TYPE__ короткое без знака #define __UINT32_C_SUFFIX__ U #define __UINT32_FMTX__ "X" #define __UINT32_FMTo__ "о" #define __UINT32_FMTu__ "у" #define __UINT32_FMTx__ "х" #define __UINT32_MAX__ 4294967295U #define __UINT32_TYPE__ беззнаковое целое число #define __UINT64_C_SUFFIX__ ULL #define __UINT64_FMTX__ "llX" #define __UINT64_FMTo__ "привет" #define __UINT64_FMTu__ "ллу" #define __UINT64_FMTx__ "llx" #define __UINT64_MAX__ 18446744073709551615ULL #define __UINT64_TYPE__ long long unsigned int #define __UINT8_C_SUFFIX__ #define __UINT8_FMTX__ "ччХ" #define __UINT8_FMTo__ "hho" #define __UINT8_FMTu__ "хху" #define __UINT8_FMTx__ "ччх" #define __UINT8_MAX__ 255 #define __UINT8_TYPE__ беззнаковый символ #define __UINTMAX_C_SUFFIX__ UL #define __UINTMAX_FMTX__ "lX" #define __UINTMAX_FMTo__ "ло" #define __UINTMAX_FMTu__ "lu" #define __UINTMAX_FMTx__ "лк" #define __UINTMAX_MAX__ 18446744073709551615UL #define __UINTMAX_TYPE__ длинное целое число без знака #define __UINTMAX_WIDTH__ 64 #define __UINTPTR_FMTX__ "lX" #define __UINTPTR_FMTo__ "ло" #define __UINTPTR_FMTu__ "лу" #define __UINTPTR_FMTx__ "лк" #define __UINTPTR_MAX__ 18446744073709551615UL #define __UINTPTR_TYPE__ длинное целое число без знака #define __UINTPTR_WIDTH__ 64 #define __UINT_FAST16_FMTX__ "hX" #define __UINT_FAST16_FMTo__ "хо" #define __UINT_FAST16_FMTu__ "ху" #define __UINT_FAST16_FMTx__ "чх" #define __UINT_FAST16_MAX__ 65535 #define __UINT_FAST16_TYPE__ короткое замыкание без знака #define __UINT_FAST32_FMTX__ "X" #define __UINT_FAST32_FMTo__ "о" #define __UINT_FAST32_FMTu__ "у" #define __UINT_FAST32_FMTx__ "х" #define __UINT_FAST32_MAX__ 4294967295U #define __UINT_FAST32_TYPE__ беззнаковое целое число #define __UINT_FAST64_FMTX__ "llX" #define __UINT_FAST64_FMTo__ "привет" #define __UINT_FAST64_FMTu__ "ллу" #define __UINT_FAST64_FMTx__ "llx" #define __UINT_FAST64_MAX__ 18446744073709551615ULL #define __UINT_FAST64_TYPE__ длинное целое без знака #define __UINT_FAST8_FMTX__ "ччХ" #define __UINT_FAST8_FMTo__ "hho" #define __UINT_FAST8_FMTu__ "хху" #define __UINT_FAST8_FMTx__ "ччх" #define __UINT_FAST8_MAX__ 255 #define __UINT_FAST8_TYPE__ беззнаковый символ #define __UINT_LEAST16_FMTX__ "hX" #define __UINT_LEAST16_FMTo__ "хо" #define __UINT_LEAST16_FMTu__ "ху" #define __UINT_LEAST16_FMTx__ "чх" #define __UINT_LEAST16_MAX__ 65535 #define __UINT_LEAST16_TYPE__ короткий без знака #define __UINT_LEAST32_FMTX__ "X" #define __UINT_LEAST32_FMTo__ "о" #define __UINT_LEAST32_FMTu__ "у" #define __UINT_LEAST32_FMTx__ "x" #define __UINT_LEAST32_MAX__ 4294967295U #define __UINT_LEAST32_TYPE__ беззнаковое целое число #define __UINT_LEAST64_FMTX__ "llX" #define __UINT_LEAST64_FMTo__ "привет" #define __UINT_LEAST64_FMTu__ "ллу" #define __UINT_LEAST64_FMTx__ "llx" #define __UINT_LEAST64_MAX__ 18446744073709551615ULL #define __UINT_LEAST64_TYPE__ long long unsigned int #define __UINT_LEAST8_FMTX__ "ччХ" #define __UINT_LEAST8_FMTo__ "hho" #define __UINT_LEAST8_FMTu__ "хху" #define __UINT_LEAST8_FMTx__ "ччх" #define __UINT_LEAST8_MAX__ 255 #define __UINT_LEAST8_TYPE__ символ без знака #define __USER_LABEL_PREFIX__ _ #define __VERSION__ "Apple LLVM 12.0.0 (лязг-1200.0.32.28)" #define __WCHAR_MAX__ 2147483647 #define __WCHAR_TYPE__ целое число #define __WCHAR_WIDTH__ 32 #define __WINT_MAX__ 2147483647 #define __WINT_TYPE__ целое число #define __WINT_WIDTH__ 32 # определить __amd64 1 # определить __amd64__ 1 #define __apple_build_version__ 12000032 #define __block __attribute__((__blocks__(byref))) #define __clang__ 1 #define __clang_major__ 12 #define __clang_minor__ 0 #define __clang_patchlevel__ 0 #define __clang_version__ "12.0.0 (clang-1200.0.32.28)" #define __code_model_small_ 1 # определить __core2 1 #define __core2__ 1 # определить __llvm__ 1 # определить __nonnull _Nonnull #define __null_unspecified _Null_unspecified #define __nullable _Nullable #define __pic__ 2 #define __seg_fs __attribute__((address_space(257))) #define __seg_gs __attribute__((address_space(256))) # определить __сильный #define __tune_core2__ 1 #define __unsafe_unretained #define __weak __attribute__((objc_gc(слабый))) # определить __x86_64 1 # определить __x86_64__ 1 ilg@wks ~ %
Макросы проекта
Вы можете использовать макросы для изменения способа, которым система проекта обращается к файлам.
Макросы делятся на четыре класса:
- Системные макросы , определенные SEGGER Embedded Studio, передают информацию о среде, например пути к общим каталогам.
- Глобальные макросы сохраняются в среде и используются всеми все решения и проекты. Как правило, вы настраиваете пути к библиотекам и любые внешние предметы здесь.
- Макросы проекта сохраняются как параметры проекта в файле проекта и могут определять значения, специфичные для решения или проекта, в котором они используются. определенный.
- Макросы сборки генерируются системой проектов при построении ваш проект.
Системные макросы
Системные макросы определяются самой SEGGER Embedded Studio и поэтому доступны только для чтения. Системные макросы можно использовать в параметрах проекта, настройках среды и обращаться к файлам. См. список системных макросов для списка системных макросов.
Глобальные макросы
Глобальные макросы хранятся в опции среды Build Macros.
Чтобы определить глобальный макрос:
- Используйте Инструменты > Параметры для отображения диалогового окна параметров среды.
- В диалоговом окне Параметры среды в группе Building выберите параметр Build Macros .
- Нажмите кнопку с многоточием справа.
- Установите макрос, используя синтаксис имя = текст замены .
Макросы проекта
Чтобы определить макрос проекта:
Чтобы установить макрос проекта:
- Выберите соответствующее решение/проект в проводнике Project Explorer .
- Используйте Project > Options , чтобы отобразить диалоговое окно параметров проекта.
- В диалоговом окне Параметры проекта в группе Общие параметры выберите параметр Макросы .
- Нажмите кнопку с многоточием справа.
- Установите макрос, используя синтаксис имя = текст замены .
Макросы сборки
Макросы сборки определяются системой проектов для сборки данный узел проекта.См. Список макросов сборки для списка макросов сборки.
Использование макросов
Вы можете использовать макрос для параметра проекта или настройки среды, используя Синтаксис $(макрос). Например, параметр Object File Name по умолчанию имеет значение $(IntDir)/$(InputName)$(OBJ).
Вы также можете указать значение по умолчанию для макроса, если оно не определено, используя синтаксис $(макрос:по умолчанию). Например, $(MyMacro:0) будет расширить до 0, если макрос MyMacro не был определен.
Написание макросов | Clojure для храбрых и настоящих
Глава 8
Когда мне было 18, я устроился ночным аудитором в отель в Санта-Фе, штат Нью-Мексико, работая четыре ночи в неделю с 23:00 до 7:00.После нескольких месяцев бессонного графика мои эмоции обрели собственную жизнь. Однажды ночью, около
3 часа ночи, я смотрела рекламу продукта, который якобы восстанавливает мужские волосы. Когда я смотрел историю одного ранее лысого человека, меня переполняла искренняя радость. "Наконец!" мой мозг хлынул. «Этот человек получил любовь и успех, которых он заслуживает! Какой невероятный продукт, дающий надежду безнадежным!»
С тех пор я задаюсь вопросом, смогу ли я каким-то образом воссоздать эмоциональную отверженность и признательность за жизнь, вызванные хроническим недосыпанием.Возможно, какое-то зелье — пара глотков, чтобы дать волю моему внутреннему Ричарду Симмонсу, но ненадолго.
Точно так же, как зелье позволяет мне временно изменить мою основную природу, макросы позволяют вам модифицировать Clojure способами, которые просто невозможны с другими языками. С помощью макросов вы можете расширить Clojure, чтобы он подходил для решения вашей задачи, создавая язык.
В этой главе вы подробно изучите, как писать макросы, начиная с простых примеров и постепенно повышая сложность.В конце вы наденете свою воображаемую кепку и используете макросы для проверки заказов клиентов в своем воображаемом интернет-магазине зелий.
К концу главы вы будете понимать все инструменты, которые будете использовать для написания макросов: кавычки, синтаксические кавычки, раскавычки, сплайсинг без кавычек (инструмент piñata) и gensym. Вы также узнаете об опасностях, подстерегающих ничего не подозревающих авторов макросов: двойное вычисление, захват переменных и заражение макросов.
Макросы необходимы
Прежде чем вы начнете писать макросы, я хочу помочь вам поместить их в правильный контекст.Да, макросы круче когтей белого медведя, но вы не должны думать о макросах как о каком-то эзотерическом инструменте, который вы вытаскиваете, когда вам хочется поэкспериментировать с вашим кодом. На самом деле, макросы позволяют Clojure извлекать большую часть своих встроенных функций из крошечного ядра функций и специальных форм. Возьмите
вместо
, например., когда
имеет следующую общую форму:(когда логическое выражение выражение-1 выражение-2 выражение-3 ... выражение-х)
Вы можете подумать, что
, когда
- это особая форма, как, если
.Ну угадайте что? Это не! В большинстве других языков вы можете создавать условные выражения только с использованием специальных ключевых слов, и нет возможности создавать свои собственные условные операторы. Однако, когда
, на самом деле является макросом.В этом расширении макроса вы можете видеть, что
, когда
реализуется с точки зрения, если
иделают
:(макрорасширение '(когда логическое выражение выражение-1 выражение-2 выражение-3)) ; => (если логическое выражение (сделать выражение-1 выражение-2 выражение-3))
Это показывает, что макросы являются неотъемлемой частью разработки Clojure — они даже используются для выполнения основных операций.Макросы не предназначены для экзотических особых случаев; вы должны думать о написании макросов как об еще одном инструменте в вашей сумке с инструментами. Когда вы научитесь писать свои собственные макросы, вы увидите, как они позволяют вам еще больше расширить язык, чтобы он соответствовал форме вашей конкретной предметной области.
Анатомия макроса
Определения макросов очень похожи на определения функций. У них есть имя, необязательная строка документа, список аргументов и тело. Тело почти всегда возвращает список.Это имеет смысл, потому что макросы — это способ преобразования структуры данных в форму, которую Clojure может оценить, а Clojure использует списки для представления вызовов функций, вызовов специальных форм и вызовов макросов. Вы можете использовать любую функцию, макрос или специальную форму в теле макроса и вызывать макросы точно так же, как функцию или специальную форму.
В качестве примера, вот наш старый знакомый макрос
infix
:(инфикс defmacro "Используй этот макрос, когда соскучишься по обозначениям своего детства" [закреплено] (список (второй инфикс) (первый инфикс) (последний инфикс)))
Этот макрос упорядочивает список в правильном порядке для инфиксной записи.Вот пример:
Одно из ключевых различий между функциями и макросами заключается в том, что аргументы функции полностью вычисляются перед передачей в функцию, тогда как макросы получают аргументы как необработанные данные. Вы можете увидеть это на примере. Если вы попытаетесь вычислить
(1 + 1)
самостоятельно, вы получите исключение. Однако, поскольку вы выполняете вызов макроса, неоцененный список(1 + 1)
передается винфикс
. Затем макрос может использоватьfirst
,second
иlast
, чтобы переупорядочить список, чтобы Clojure мог его оценить:(макрорасширение '(инфикс (1+1))) ; => (+ 1 1)
Развернув макрос, можно увидеть, что
инфикс
переставляет(1 + 1)
в(+ 1 1)
.Удобно!Вы также можете использовать деструктуризацию аргументов в определениях макросов, как и в функциях:
(дефмакрос инфикс-2 [[операнд1 или операнд2]] (список op операнд1 операнд2))
Аргументы деструктурирования позволяют кратко привязать значения к символам на основе их положения в последовательном аргументе. Здесь
infix-2
принимает последовательную структуру данных в качестве аргумента и деструктурирует по положению, поэтому первое значение называетсяоперанд1
, второе значение называетсяop
, а третье значение называетсяоперанд2
в макросе. .Вы также можете создавать макросы с множественной арностью, и фактически основные логические операции
.и
иили
определены как макросы. Вот исходный коди
:(дефмакро и "Вычисляет выражения по одному слева направо. Если форма возвращает логическую ложь (ноль или ложь) и возвращает это значение и не оценивает никакие другие выражения, иначе возвращается значение последнего выражения. (и) возвращает истину». {:добавлено "1.0"} ([] истинный) ([х] х) ([х и далее] `(пусть [и# ~x] (если и# (и ~@next) и#))))
В этом примере происходит много всего, включая символы
`
и~@
, о которых вы скоро узнаете. На данный момент важно понять, что здесь есть три тела макроса: тело макроса с градацией 0, которое всегда возвращаетtrue
, тело макроса с градацией 1, которое возвращает операнд, и тело макроса с градацией n , которое рекурсивно называет себя.Правильно: макросы могут быть рекурсивными, и они также могут использовать оставшиеся аргументы (и следующий
в теле макроса n -arity), как и функции.Теперь, когда вы освоились с анатомией макросов, пришло время привязать себя к своей мыслительной мачте в стиле Одиссея и научиться писать тела макросов.
Списки зданий для оценки
Написание макроса — это создание списка для оценки Clojure, и это требует своего рода инверсии вашего обычного образа мышления.Во-первых, вам часто нужно будет заключать выражения в кавычки, чтобы получить невычисленные структуры данных в вашем окончательном списке (мы вернемся к этому чуть позже). В общем, вам нужно быть особенно осторожным с разницей между символом и его значением .
Отличительные символы и значения
Допустим, вы хотите создать макрос, который принимает выражение, печатает и возвращает его значение. (Это отличается от
println
тем, чтоprintln
всегда возвращаетnil
.) Вы хотите, чтобы ваш макрос возвращал списки, которые выглядят следующим образом:(пусть [выражение результата] (распечатать результат) результат)
Ваша первая версия макроса может выглядеть так, используя функцию
list
для создания списка, который должен оценить Clojure:(defmacro my-print-whoopsie [выражение] (list let [выражение результата] (перечислить результат печати) результат))
Однако, если вы попытаетесь это сделать, вы получите исключение
Невозможно принять значение макроса: #'clojure.ядро / пусть
. Что тут происходит?Причина, по которой это происходит, заключается в том, что ваше тело макроса пытается получить значение , на которое ссылается символ
let
, тогда как на самом деле вы хотите вернуть сам символlet
. Есть и другие проблемы: вы пытаетесь получить значениерезультата
, которое не привязано, и вы пытаетесь получить значениеprintln
вместо того, чтобы вернуть его символ. Вот как бы вы написали макрос, чтобы он делал то, что вы хотите:(defmacro my-print [выражение] (список 'пусть ['выражение результата] (перечислите результат 'println') 'результат))
Здесь вы заключаете в кавычки каждый символ, который хотите использовать в качестве символа, добавляя к нему префикс одинарной кавычки
'
.Это говорит Clojure отключить оценку для всего, что последует, в этом случае предотвращая попытки Clojure разрешить символы и вместо этого просто возвращая символы. Возможность использования цитирования для отключения оценки является центральной для написания макросов, поэтому давайте выделим для этой темы отдельный раздел.Простое цитирование
Вы почти всегда будете использовать кавычки в своих макросах для получения неоцененного символа. Давайте кратко повторим цитирование, а затем посмотрим, как вы можете использовать его в макросе.
Во-первых, вот простой вызов функции без кавычек:
Если мы добавим
цитату
в начале, она вернет неоцененную структуру данных:(цитата (+ 1 2)) ; => (+ 1 2)
Здесь в возвращаемом списке
.+
— символ. Если мы оценим этот символ плюса, он даст функцию плюса:+ ; => #
Принимая во внимание, что если мы процитируем символ плюса, он просто даст символ плюса:
При оценке несвязанного символа возникает исключение:
потеть старичкам ; => Невозможно разрешить символ: в этом контексте потеют старички
Но цитирование символа возвращает символ независимо от того, имеет ли символ связанное с ним значение:
(цитирую старичкам) ; => потеть перед старичками
Символ одиночной кавычки является макросом чтения для
(кавычки
x)
:'(+ 1 2) ; => (+ 1 2) 'д-р Джекилл и Ричард Симмонс ; => др-джекил-и-ричард-симмонс
Вы можете увидеть цитирование в работе в макросе
.when
.Это, тогда как фактический исходный код
:(дефмакрос, когда «Оценивает тест. Если логично, что это правда, оценивает тело в неявном выполнении». {:добавлено "1.0"} [тест и тело] (список 'если тест (минусы' сделать тело)))
Обратите внимание, что в определении макроса
.заключены в кавычки, если
, иделают
. Это потому, что вы хотите, чтобы эти символы были в окончательном списке, который, когда
возвращает для оценки. Вот пример того, как может выглядеть возвращаемый список:(макросрасширение '(когда (коровы-приходят:домой) (позвони мне: папочка) (шлепни меня глупо))) ; => (если (коровы-приходят :домой) (сделай (позвони мне: папочка) (шлепни меня глупо)))
Вот еще один пример исходного кода для встроенного макроса, на этот раз для
, если только
:(defmacro, если «Перевернутое« если »» [тест и ветки] (conj (обратные ветви) test 'if))
Опять же, вы должны указать
, если
, потому что вы хотите, чтобы неоцененный символ был помещен в результирующий список, как этот:(макросрасширение '(если только (сделано-получили пощечину? меня) (шлепни меня : глупо) (сказать: «Я думаю, это меня научит»))) ; => (если (сделано-получили пощечину? меня) (сказать: «Я думаю, это меня научит») (шлепни меня : глупо))
Во многих случаях при написании макросов вы будете использовать подобные простые кавычки, но чаще всего вы будете использовать более мощные синтаксические кавычки.
Синтаксическое цитирование
До сих пор вы видели макросы, которые создают списки, используя функцию
list
для создания списка вместе с'
(цитата), и функции, которые работают со списками, такими какfirst
,second
,last
и так далее. В самом деле, вы можете писать макросы таким образом, пока коровы не вернутся домой. Однако иногда это приводит к утомительному и многословному коду.Синтаксическое цитирование возвращает необработанные структуры данных, аналогичные обычному цитированию.Однако есть два важных отличия. Одно отличие состоит в том, что при заключении в синтаксические кавычки будет возвращено полных символа (то есть с включенным пространством имен символа). Давайте сравним цитирование и синтаксическое цитирование.
Цитирование не включает пространство имен, если ваш код не включает пространство имен:
Запишите пространство имен, и оно будет возвращено обычной кавычкой:
'clojure.core/+ ; => clojure.core/+
Синтаксическое цитирование всегда будет включать полное пространство имен символа:
При рекурсивном цитировании списка все элементы заключаются в кавычки:
Синтаксис рекурсивного цитирования списка синтаксис заключает в кавычки все элементы:
`(+ 1 2) ; => (clojure.ядро/+ 1 2)
Причина, по которой синтаксические кавычки включают пространство имен, состоит в том, чтобы помочь вам избежать конфликтов имен, эта тема рассматривается в главе 6.
Другое различие между кавычками и синтаксическими кавычками состоит в том, что последнее позволяет вам раскатываться из форм с помощью тильды,
~
. В этом смысле это похоже на криптонит: всякий раз, когда Супермен оказывается рядом с криптонитом, его силы исчезают. Всякий раз, когда тильда появляется в форме с синтаксическими кавычками, способность синтаксических кавычек возвращать неоцененные формы с полным пространством имен исчезает.Вот пример:`(+ 1 ~(вкл. 1)) ; => (clojure.core/+ 1 2)
Поскольку он стоит после тильды,
(inc 1)
оценивается, а не кавычивается. Без кавычек синтаксические кавычки возвращают неоцененную форму с полными символами:`(+ 1 (включая 1)) ; => (clojure.core/+ 1 (clojure.core/inc 1))
Если вы знакомы с интерполяцией строк, вы можете аналогичным образом думать о синтаксисе заключения/раскрытия кавычек.В обоих случаях вы создаете своего рода шаблон, помещая несколько переменных в более крупную статическую структуру. Например, в Ruby вы можете создать строку
«Взбивай масло, Джебедайя!»
через конкатенацию:имя = "Джебедия" "Взбивай свое масло, " + имя + "!"
или через интерполяцию:
"Взбивай масло, #{имя}!"
Точно так же, как интерполяция строк приводит к более четкому и лаконичному коду, синтаксические кавычки и раскаты позволяют создавать списки более четко и лаконично.Сравните использование функции
list
, показанной первой, с использованием синтаксических кавычек:(список '+ 1 (вкл. 1)) ; => (+ 1 2) `(+ 1 ~(вкл. 1)) ; => (clojure.core/+ 1 2)
Как видите, версия с синтаксическими кавычками более лаконична. Кроме того, его визуальная форма ближе к окончательной форме списка, что облегчает понимание.
Использование синтаксического цитирования в макросе
Теперь, когда вы хорошо разобрались в том, как работает синтаксическое цитирование, взгляните на макрос
code-critic
.Вы собираетесь написать более краткую версию, используя синтаксические кавычки.(критик кода defmacro "Фразы любезно предоставлены Гермесом Конрадом из Футурамы" [Плохой хороший] (список 'делать (список 'println "Великий мадридский кальмар, это плохой код:" (список 'цитировать плохо)) (список 'println "Милая горилла из Манилы, это хороший код:" (список цитаты хороший)))) (код-критик (1 + 1) (+ 1 1)) ; => Великий мадридский кальмар, это плохой код: (1 + 1) ; => Сладкая горилла из Манилы, это хороший код: (+ 1 1)
Один только взгляд на все эти утомительные повторения
списка
и одинарных кавычек заставляет меня съеживаться.Но если вы перепишетекод-критик
, используя синтаксические кавычки, вы можете сделать его гладким и лаконичным:(критик кода defmacro "Фразы любезно предоставлены Гермесом Конрадом из Футурамы" [Плохой хороший] `(do (println "Мадридский кальмар, это плохой код:" (цитата ~плохо)) (println "Милая горилла из Манилы, это хороший код:" (цитата ~хорошо))))
В этом случае вы хотите заключить в кавычки все, кроме символов
хороший
иплохой
.В исходной версии вы должны цитировать каждую часть по отдельности и явно помещать ее в список громоздким способом, просто чтобы предотвратить цитирование этих двух символов. С помощью синтаксического заключения в кавычки вы можете просто заключить все выражениеdo
в кавычки и просто убрать из кавычек два символа, которые вы хотите оценить.На этом введение в механику написания макроса завершено! Сладкий священный удав Западного и Восточного Самоа, это было много!
Подводя итог, макросы получают необработанные произвольные структуры данных в качестве аргументов и возвращают структуры данных, которые вычисляет Clojure.При определении вашего макроса вы можете использовать деструктурирование аргументов так же, как вы можете использовать функции и привязки
let
. Вы также можете писать множественные и рекурсивные макросы.В большинстве случаев ваши макросы будут возвращать списки. Вы можете создать возвращаемый список, используя функции
list
или используя синтаксические кавычки. Синтаксическое цитирование обычно приводит к более ясному и лаконичному коду, потому что позволяет создать шаблон структуры данных, которую вы хотите вернуть, и которую легче анализировать визуально.Независимо от того, используете ли вы синтаксические кавычки или простые кавычки, важно четко понимать различие между символом и значением, которое он оценивает при построении списка. И если вы хотите, чтобы ваш макрос возвращал несколько форм для оценки Clojure, не забудьте заключить их вdo
.Рефакторинг макроса и объединение без кавычек
Этот макрос
code-critic
из предыдущего раздела все еще нуждается в некотором улучшении. Посмотрите на дублирование! Два вызоваprintln
практически идентичны.Давайте очистим это. Во-первых, давайте создадим функцию для создания этих списковprintln
. О функциях легче думать и играть с ними, чем с макросами, поэтому часто хорошей идеей является перенос макросов во вспомогательные функции:(определить код критики [код критики] `(println ~критика (цитата ~код))) (критик кода defmacro [Плохой хороший] `(do ~(criticize-code "Проклятые бактерии Либерии, это плохой код:" плохой) ~(критика-код "Сладкий священный удав Западного и Восточного Самоа, это хороший код:"хорошо)))
Обратите внимание, как функция
критики-кода
возвращает список с синтаксисом в кавычках.Вот как вы создаете список, который вернет макрос.Тем не менее, есть много возможностей для улучшения. Код по-прежнему имеет несколько почти идентичных вызовов функции. В такой ситуации, когда вы хотите применить одну и ту же функцию к набору значений, имеет смысл использовать функцию seq, например
.map
:(критик кода defmacro [Плохой хороший] `(сделать ~(карта #(применить код критики %) [["Великий мадридский кальмар, это плохой код:" плохой] ["Милая горилла из Манилы, это хороший код:" хорошо]])))
Выглядит немного лучше.Вы сопоставляете каждую пару критика/код и применяете к паре функцию
критика-код
. Попробуем запустить код:(код-критик (1 + 1) (+ 1 1)) ; => NullPointerException
О нет! Это вообще не сработало! Что случилось? Проблема в том, что
map
возвращает список, и в этом случае он вернул списокprintln
выражений. Нам просто нужен результат каждого вызоваprintln
, но вместо этого этот код вставляет оба результата в список, а затем пытается оценить этот список.Другими словами, при оценке этого кода Clojure получает что-то вроде этого:
Затем(сделать ((clojure.core/println "критика" '(1 + 1)) (clojure.core/println "критика" '(+ 1 1))))
оценивает первый вызов
println
, чтобы дать нам это:(сделать (ноль (clojure.core/println "критика" '(+ 1 1))))
и после оценки второго вызова
println
делает следующее:Это причина исключения.
println
оценивается какnil
, поэтому мы получаем что-то вроде(nil nil)
.nil
не вызывается, и мы получаемNullPointerException
.Какое неудобство! Но так получилось, что именно для таких ситуаций было придумано сплайсинг без кавычек. Сращивание без кавычек выполняется с
~@
. Если вы просто выведете список из кавычек, вот что вы получите:`(+ ~(список 1 2 3)) ; => (clojure.core/+ (1 2 3))
Однако, если вы используете сращивание без кавычек, вы получите следующее:
`(+ ~@(список 1 2 3)) ; => (clojure.ядро/+ 1 2 3)
Объединение без кавычек разворачивает разделяемую структуру данных, помещая ее содержимое непосредственно во вложенную структуру данных с синтаксисом в кавычках. Это как
~@
— это кувалда, а все, что последует за ней, — это пиньята, а в результате получается самая ужасающая и потрясающая вечеринка, на которой вы когда-либо были.В любом случае, если вы используете сплайсинг без кавычек в своем код-критике, то все будет отлично работать:
(критик кода defmacro [{:ключи [хорошо плохо]}] `(сделать ~@(карта #(применить код критики %) [["Милый сионский лев, это плохой код:" плохой] ["Большая корова Москвы, это хороший код:" хорошо]]))) (код-критик (1 + 1) (+ 1 1)) ; => Милый лев Сиона, это плохой код: (1 + 1) ; => Великая корова Москвы, это хороший код: (+ 1 1)
Уухууу! Вы успешно извлекли повторяющийся код в функцию и сделали код макроса чище.Милая морская свинка Виннипега, это хороший код!
На что обратить внимание
В макросахесть пара коварных подводных камней, о которых вам следует знать. В этом разделе вы узнаете о некоторых ловушках макросов и о том, как их избежать. Надеюсь, вы еще не оторвались от своей мыслительной мачты.
Захват переменных
Захват переменных происходит, когда макрос вводит привязку, которая, неизвестная пользователю макроса, затмевает существующую привязку. Например, в следующем коде макрос лукаво вводит свою собственную привязку
let
, и это нарушает код:(деф-сообщение «Хорошая работа!») (defmacro с озорством [и дела] (concat (list 'let ['сообщение "О, большое дело!"]) дела)) (с озорством (println "Вот как я отношусь к тому, что вы сделали: " сообщение)) ; => Вот как я отношусь к тому, что ты сделал: О, большое дело!
Вызов
println
ссылается на символmessage
, который, как мы думаем, связан со строкой"Хорошая работа!"
.Однако макросwith-mischief
создал новую привязку для сообщения.
Обратите внимание, что этот макрос не использует синтаксические кавычки. Это приведет к исключению:
(деф-сообщение «Хорошая работа!») (defmacro с озорством [и дела] `(let [сообщение "О, большое дело!"] ~@вещи, которые нужно сделать)) (с озорством (println "Вот как я отношусь к тому, что вы сделали: " сообщение)) ; Исключение: нельзя разрешить полное имя: пользователь/сообщение
Это исключение сделано для вашего же блага: синтаксические кавычки предназначены для предотвращения случайного захвата переменных в макросах.Если вы хотите ввести привязки
.let
в свой макрос, вы можете использовать gensym . Функцияgensym
создает уникальные символы при каждом последующем вызове:(генсим) ; => G__655 (генсим) ; => G__658
Вы также можете передать префикс символа:
(сообщение gensym) ; => сообщение4760 (сообщение gensym) ; => сообщение4763
Вот как можно переписать
с озорством
, чтобы оно было менее озорным:(defmacro без вреда [и дела] (пусть [макро-сообщение (gensym' сообщение)] `(let [~макрос-сообщение "О, большое дело!"] ~@вещи, которые нужно сделать (println "Мне еще нужно сказать: " ~макро-сообщение)))) (без озорства (println "Вот как я отношусь к тому, что вы сделали: " сообщение)) ; => Вот как я отношусь к тому, что вы сделали: Хорошая работа! ; => Мне все еще нужно сказать: О, большое дело!
В этом примере избегается захват переменных за счет использования
.gensym
для создания нового уникального символа, который затем привязывается к макросообщению.В выражении
let
, заключенном в синтаксические кавычки, макросообщениене заключено в кавычки и преобразуется в символ gensym’d. Этот сгенерированный символ отличается от любых символов в пределах
дел
, поэтому вы избегаете захвата переменных. Поскольку это очень распространенный шаблон, вы можете использовать auto-gensym . Auto-gensyms — это более лаконичный и удобный способ использования gensyms:`(бларж# бларж#) (бларг__2869__авто__ бларг__2869__авто__) `(пусть [имя# "Ларри Поттер"] имя#) ; => (clojure.core/let [name__2872__auto__ "Ларри Поттер"] name__2872__auto__)
В этом примере вы создаете автогенсим путем добавления хеш-метки (или хэштега , если вы настаиваете) к символу в списке с синтаксисом в кавычках. Clojure автоматически гарантирует, что каждый экземпляр x
#
разрешается в один и тот же символ в одном и том же списке с синтаксисом в кавычках, что каждый экземпляр y#
разрешается одинаково и так далее.
gensym
и auto-gensym постоянно используются при написании макросов и позволяют избежать захвата переменных.Двойная оценка
Еще одна проблема, на которую следует обратить внимание при написании макросов, — это двойная оценка , которая возникает, когда форма, переданная макросу в качестве аргумента, оценивается более одного раза. Рассмотрим следующее:
(отчет defmacro [пытаться] `(если ~попытаться (println (quote ~to-try) "успешно:" ~to-try) (println (quote ~to-try) "не удалось:" ~to-try))) ;; Thread/sleep занимает несколько миллисекунд, чтобы заснуть. (отчет (сделать (Тред/спать 1000) (+ 1 1)))
Этот код предназначен для проверки правильности аргумента.Если аргумент верен, он считается успешным; если это ложно, это неудачно. Макрос печатает, был ли его аргумент успешным. В этом случае вы фактически заснете на две секунды, потому что
(Thread/sleep 1000)
оценивается дважды: один раз сразу после, если
, и еще раз, когда вызываетсяprintln
. Это происходит потому, что код(do (Thread/sleep 1000) (+ 1 1))
повторяется во всем раскрытии макроса. Как будто вы написали это:(if (do (Thread/sleep 1000) (+ 1 1)) (println '(do (Thread/sleep 1000) (+ 1 1)) "Был успешен:" (сделать (Тред/спать 1000) (+ 1 1))) (println '(do (Thread/sleep 1000) (+ 1 1)) "не удалось:" (сделать (Тред/спать 1000) (+ 1 1))))
«Большое дело!» ваш внутренний пример критик говорит.Что ж, если бы ваш код делал что-то вроде перевода денег между банковскими счетами, это было бы очень важно. Вот как можно избежать этой проблемы:
(отчет defmacro [пытаться] `(пусть [result# ~to-try] (если результат# (println (quote ~to-try) "успешно:" результат#) (println (quote ~to-try) "не удалось:" результат#))))
Помещая
to-try
в выражениеlet
, вы оцениваете этот код только один раз и связываете результат с автоматически созданным символом,result#
, на который теперь можно ссылаться без повторного вычисленияto- попробуйте код
.Макросы до конца
Одной тонкой ловушкой при использовании макросов является то, что вам может понадобиться писать все больше и больше макросов, чтобы что-то сделать. Это следствие того, что макрорасширение происходит до вычисления.
Например, предположим, что вы хотите получить
дозэкв
с помощью макросаотчета
. Вместо нескольких звонков для отчета:(отчет (= 1 1)) ; => (= 1 1) выполнено успешно: верно (отчет (= 1 2)) ; => (= 1 2) не удалось: false
повторим:
(дозэкв [код ['(= 1 1) '(= 1 2)]] (код отчета)) ; => код был успешным: (= 1 1) ; => код был успешным: (= 1 2)
Макрос отчета работает нормально, когда мы передаем ему функции по отдельности, но когда мы используем
дозыq
для итерацииотчета
по нескольким функциям, это бесполезный сбой.Вот как будет выглядеть макрорасширение для одной из итерацийдозыq
:(если код (код clojure.core/println «был успешным:» код) (код clojure.core/println «не удался:» код))
Как видите, отчет
получает неоцененный символ
с кодом
на каждой итерации; однако мы хотим, чтобы он получал любой код, к которому привязан код
, во время оценки. Но отчет, работающий во время раскрытия макроса, просто не может получить доступ к этим значениям.Как будто у него есть руки тираннозавра, а значения времени выполнения навсегда вне его досягаемости.
Чтобы разрешить эту ситуацию, мы могли бы написать еще один макрос, например:
(defmacro dosq-макрос [макроимя и аргументы] `(сделать ~@(map (fn [arg] (список макроимя arg)) args))) (доза-макрос отчет (= 1 1) (= 1 2)) ; => (= 1 1) выполнено успешно: верно ; => (= 1 2) не удалось: false
Если вы когда-нибудь окажетесь в такой ситуации, найдите время, чтобы переосмыслить свой подход.Легко загнать себя в угол, делая невозможным выполнение каких-либо действий с помощью заурядных вызовов функций. Вместо этого вам придется писать больше макросов. Макросы чрезвычайно мощные и потрясающие, и вы не должны бояться их использовать. Они превращают средства Clojure для работы с данными в средства для создания новых языков, учитывающих ваши проблемы программирования. Для некоторых программ допустимо, чтобы ваш код на 90 процентов состоял из макросов. Какими бы замечательными они ни были, они также добавляют новые проблемы с композицией.На самом деле они компонуются только друг с другом, поэтому, используя их, вы можете упустить другие виды композиций (функциональные, объектно-ориентированные), доступные вам в Clojure.
Мы рассмотрели всю механику написания макроса. Похлопайте себя по спине! Это довольно большое дело!
Чтобы закрыть эту главу, наконец пришло время надеть свою притворяющуюся кепку и поработать над тем интернет-магазином зелий, о котором я говорил в самом начале главы.
Пиво для смелых и настоящих
В начале этой главы я рассказал о своей мечте: найти какой-нибудь напиток, который после приема внутрь временно давал бы мне силу и темперамент гуру фитнеса 80-х, освобождая меня из тюрьмы запретов и самосознания. .Я уверен, что кто-то где-нибудь когда-нибудь изобретет такой эликсир, так что мы могли бы заняться системой продажи этого мифического зелья. Назовем эту гипотетическую смесь Brave and True Ale . Это имя пришло мне в голову ни с того, ни с сего.
Перед тем, как поступит заказ , выливающий (каламбур! Дай пять!), нам нужно провести некоторую проверку. В этом разделе показано, как выполнить эту проверку функционально и как написать код, выполняющий проверки, немного более лаконично, используя написанный вами макрос с именем
if-valid
.Это поможет вам понять типичную ситуацию для написания собственного макроса. Если вам просто нужно определение макроса, можно сразу перейти к «if-valid
» на стр. 182.Функции проверки
Для простоты мы будем беспокоиться только о проверке имени и адреса электронной почты для каждого заказа. Я думаю, что для нашего магазина мы захотим, чтобы детали заказа были представлены следующим образом:
.(детали заказа по умолчанию {:name "Митчард Блиммонс" : электронная почта "Митчард.blimmonsgmail.com"})
Эта конкретная карта имеет неверный адрес электронной почты (отсутствует символ
.@
), так что это именно тот заказ, который должен отловить наш код проверки! В идеале мы хотим написать код, который выдает что-то вроде этого:(подтвердить детали заказа, детали заказа, проверки) ; => {:email ["Ваш адрес электронной почты не похож на адрес электронной почты."]}
То есть мы хотим иметь возможность вызывать функцию
validate
с данными, которые требуют проверки, и определением того, как их проверять.Результатом должна быть карта, в которой каждый ключ соответствует недопустимому полю, а каждое значение является вектором одного или нескольких сообщений проверки для этого поля. Следующие две функции выполняют эту работу.Сначала рассмотрим
сведения о заказе
. Вот как вы могли бы представить проверки:(заказ-подробности-проверки {:название ["Пожалуйста, введите имя" не пусто] :электронное письмо ["Пожалуйста, введите адрес электронной почты" не пусто "Ваш адрес электронной почты не похож на адрес электронной почты" #(или (пусто? %) (повторная последовательность #"@" %))]})
Это карта, в которой каждый ключ связан с вектором сообщения об ошибке и парами функций проверки.Например,
:имя
имеет одну функцию проверки,непусто
; если эта проверка не пройдена, вы должны получить сообщение об ошибке"Пожалуйста, введите имя"
.Далее нам нужно написать функцию
проверки
. Функцияvalidate
может быть разделена на две функции: одна для применения проверок к одному полю, а другая для накопления этих сообщений об ошибках в окончательную карту сообщений об ошибках, например{:email ["Ваш адрес электронной почты не похож на адрес электронной почты."]}
. Вот функция с именемсообщений об ошибках для
, которая применяет проверки к одному значению:(определить сообщения об ошибках для "Вернуть последовательность сообщений об ошибках" [для проверки пар сообщения-валидатора] (сначала сопоставьте (фильтр #(не ((второй %) для проверки)) (раздел 2 пары сообщение-валидатор))))
Первый аргумент,
to-validate
, — это поле, которое вы хотите проверить. Второй аргумент,пар сообщения-валидатора
, должен быть последовательностью с четным числом элементов.Эта последовательность группируется в пары с(пары сообщения-валидатора раздела 2)
. Первым элементом пары должно быть сообщение об ошибке, а вторым элементом пары должна быть функция (точно так же, как пары организованы всведения о заказе-проверки
). Функцияerror-messages-for
работает путем фильтрации всех пар сообщений об ошибках и проверки, где функция проверки возвращаетtrue
при применении кдля проверки
. Затем он используетmap first
, чтобы получить первый элемент каждой пары, сообщение об ошибке.Вот он в действии:(сообщения об ошибках для "" ["Пожалуйста, введите имя" не пусто]) ; => ("Пожалуйста, введите имя")
Теперь нам нужно собрать эти сообщения об ошибках на карте.
Вот полная функция
проверки
, а также вывод, когда мы применяем ее к нашимсведениям о заказе
исведениям о заказе
:(определ. проверка "Возвращает карту с вектором ошибок для каждого ключа" [для проверки валидации] (уменьшить (fn [проверка ошибок] (пусть проверка [[fieldname validation-check-groups] значение (получить подтверждение имени поля) сообщения об ошибках (сообщения об ошибках для групп проверки значений)] (если (пусто? сообщения об ошибках) ошибки (сообщения об ошибках assoc error fieldname)))) {} проверки)) (подтвердить детали заказа, детали заказа, проверки) ; => {:email ("Ваш адрес электронной почты не похож на адрес электронной почты")}
Успех! Это работает путем сокращения более
сведений о заказе
и связывания сообщений об ошибках (если они есть) для каждого ключасведений о заказе
в окончательную карту сообщений об ошибках.если-действительно
С нашим кодом проверки теперь мы можем проверять записи сколько душе угодно! Чаще всего валидация будет выглядеть примерно так:
(пусть [ошибки (проверить детали заказа, детали заказа, проверки)] (если (пусто? ошибки) (печать: успех) (println: ошибки ошибки)))
Шаблон должен сделать следующее:
- Проверка записи и привязка результата к
ошибкам
- Проверить, были ли ошибки
- Если да, сделайте успех, здесь
(println :success)
- В противном случае сделайте ошибку, здесь
(println :failure errors)
Я действительно использовал этот код проверки на реальных веб-сайтах.Сначала я поймал себя на том, что снова и снова повторяю незначительные вариации кода — верный признак того, что мне нужно ввести абстракцию, скрывающую повторяющиеся части: применение функции
.validate
, привязка результата к какому-либо символу и проверка результат пустой. Чтобы создать эту абстракцию, у вас может возникнуть соблазн написать такую функцию:(определить, если действительно [код подтверждения записи код успеха код ошибки] (пусть [ошибки (проверить валидацию записи)] (если (пусто? ошибки) код успеха код отказа)))
Однако это не сработает, потому что
код успеха
икод ошибки
будут оцениваться каждый раз.Макрос будет работать, потому что макросы позволяют вам управлять оценкой. Вот как вы могли бы использовать макрос:(if-valid order-details order-details-validations errors (рендер: успех) (ошибки рендеринга: сбой))
Этот макрос скрывает повторяющиеся детали и помогает более кратко выразить свое намерение. Это все равно, что попросить кого-нибудь дать вам открывалку вместо того, чтобы сказать: «Пожалуйста, дайте мне ручное устройство для удаления временного герметика из стеклянного контейнера с жидкостью.Вот реализация:
(defmacro, если допустимо "Обрабатывать проверку более лаконично" [для проверки имени ошибки проверки, а затем еще] `(let [~имя-ошибки (подтвердить ~подтвердить ~проверки)] (если (пусто? ~имя-ошибки) ~@тогда-иначе)))
Этот макрос принимает четыре аргумента:
для проверки
,проверки
,имя_ошибки
и оставшийся аргументзатем-иначе
. Использованиеerror-name
— это новая стратегия.Мы хотим иметь доступ к ошибкам, возвращаемым функциейvalidate
в операторахthen-else
. Для этого мы сообщаем макросу, к какому символу он должен привязать результат. Следующий макрос показывает, как это работает:(макроразвернуть '(if-valid order-details order-details-validations my-error-name (печать: успех) (println :failure имя-моей-ошибки))) (позволять* [my-error-name (user/validate order-details order-details-validations)] (если (кложур.ядро/пусто? мое-имя-ошибки) (печать: успех) (println :failure имя-моей-ошибки)))
Синтаксическая цитата абстрагирует общую форму шаблона
let/validate/if
, который вы видели ранее. Затем мы используем сращивание без кавычек, чтобы распаковать, если
ветвей, которые были упакованы в оставшийся аргумент, то-еще
.Это довольно просто! После всех этих разговоров о макросах и подробном рассмотрении их механики, держу пари, вы ожидали чего-то более сложного.Извини, друг. Если вам трудно справиться с разочарованием, я знаю один напиток, который поможет.
Резюме
В этой главе вы узнали, как писать свои собственные макросы. Макросы определяются очень похоже на функции: у них есть аргументы, строка документации и тело. Они могут использовать деструктуризацию аргументов и остальные аргументы, а также могут быть рекурсивными. Ваши макросы почти всегда будут возвращать списки. Иногда вы будете использовать функции
list
иseq
для простых макросов, но в большинстве случаев вы будете использовать синтаксическую кавычку`
, которая позволяет вам писать макросы, используя безопасный шаблон.Когда вы пишете макросы, важно помнить о различиях между символами и значениями: макросы раскрываются до оценки кода и поэтому не имеют доступа к результатам оценки. Двойное вычисление и захват переменных — две другие тонкие ловушки для неосторожных, но вы можете избежать их, разумно используя выражения
let
и gensyms.Макросы — это забавные инструменты, которые позволяют писать код с меньшим количеством запретов. Позволяя вам управлять оценкой, макросы дают вам степень свободы и выражения, которую другие языки просто не позволяют.На протяжении всего вашего знакомства с Clojure вы, вероятно, будете слышать, как люди предостерегают вас от их использования, говоря такие вещи, как «Макросы — это зло» и «Никогда не следует использовать макросы». Не слушайте этих ханжей — по крайней мере, сначала! Иди туда и хорошо проведи время. Только так вы узнаете, в каких ситуациях уместно использовать макросы. Вы выйдете с другой стороны, зная, как использовать макросы с умением и щегольством.
Упражнения
- Напишите макрос
, когда-действительно
, чтобы он вел себя аналогично, когда
.Вот пример его вызова:(когда действует информация о заказе информация о заказе подтверждается (println "Это успех!") (рендер: успех))
- Когда данные допустимы, формы
println
иrender
должны быть оценены, аwhen-valid
должен вернутьnil
, если данные недействительны.- Вы видели, что
и
реализованы как макрос. Реализуйтеили
как макрос.- В главе 5 вы создали ряд функций (
c-int
,c-str
,c-dex
) для чтения атрибутов персонажа RPG.Напишите макрос, определяющий произвольное количество функций извлечения атрибутов с помощью одного вызова макроса. Вот как бы вы это назвали:(defattrs c-int :intelligence c-str: сила c-dex : ловкость)
РАСПОЗНАВАНИЕ ЭКРАНА HATS С ИСПОЛЬЗОВАНИЕМ ПЕРЕМЕННОЙ В МАКРО НЕ РАБОТАЕТ
Состояние APAR
Описание ошибки
Локальное исправление
Для обхода 1 установка promptall=false вызовет запрос действия, которые должны обрабатываться при их выполнении, а не до запускается макрос.Например, допустим, у вас есть 5 подсказок и каждое приглашение обрабатывается с помощью обработчика макросов по умолчанию. Каждый подсказка содержится в отдельном экране макросов. С участием promptall=true вы получите на веб-странице запрос значений для всех 5 подсказок. Это происходит до запуска макроса Бег. С promptall=false вы будете получать веб-страницу каждый раз. время появления подсказки во время воспроизведения макроса. Вы получите 5 отдельных веб-страниц, запрашивающих значение 1 быстрый. Для работы вокруг 2 вы должны использовать макропеременные.Это будет привести к тому, что ваш макрос будет преобразован в расширенный формат. это не действительно проблема, но это может сделать работу с вашим макросом немного сложнее.Краткое описание проблемы
**************************************************** ***************** * ЗАТРОНУТЫ ПОЛЬЗОВАТЕЛИ: Разработчики макросов, использующие глобальные переменные * * для распознавания экрана * ******************************************************* **************** * ОПИСАНИЕ ПРОБЛЕМЫ: В макросе вы можете извлечь данные из * * скрин хоста и поместите его в HATS * * глобальная переменная.Этот глобальный * * переменная позже может использоваться как экран * * критерии признания * * макроэкран. Несмотря на то, что * * действие извлечения * * встречается глобальный HATS * * переменная не обновляется и * * распознавание экрана * * на основе глобального HATS * * переменная не работает.* ******************************************************* **************** * РЕКОМЕНДАЦИЯ: * ******************************************************* **************** Критерии распознавания экрана с использованием глобальной переменной HATS не не работа при использовании в макросе.Вывод проблемы
Во время обработки макроса HATS ставит в очередь все извлечения макроса Мероприятия. Этот очередь обрабатывается, когда происходит изменение состояния макроса.А экстракт макроса событие не вызывает изменения состояния макроса. Макрос ошибка или макрос завершение вызывает изменение состояния макроса. Макрос подсказка вызовет изменение состояния макроса, если promptAll=false. Когда макрос изменение состояния происходит, HATS обрабатывает очередь событий извлечения макроса и ручки их согласно информации в HATSтег. С этим дизайн, глобальные переменные HATS не могут быть обновлены с помощью извлеченные данные до завершения макроса.Это вызовет проблему, если Шляпы глобальные переменная используется в качестве критерия распознавания экрана для макро экран. Глобальная переменная HATS используется до того, как устанавливается. Чинить этой проблемы мы добавили новый атрибут в HATS тег <извлечение>. Это тег в верхней части макроса. То атрибут называется "updateVariableImmediately" и принимает значение либо истинно, либо ложно. Если установлено значение true, глобальные переменные HATS обновляются при действие извлечения макроса имеет место.Если установлено значение false, глобальные переменные HATS не обновляется, когда макрос действие извлечения происходит, но позже во время макроса изменение состояния. То значение по умолчанию для этого атрибута — false. ложь была выбрал так макросы в настоящее время в производстве не ведут себя по-другому. Если вы хотели бы, чтобы ваш Глобальные переменные HATS должны быть немедленно обновлены с помощью извлеченные данные затем добавьте этот атрибут в соответствующий тег с помощью значение истинно. Например: <обработчик извлечения = "по умолчанию.jsp" индекс = "0", индексированный = "ложь" имя = "ex7" перезаписать = "истина" тип самолета = "TEXT_PLANE" сохранить = "истинный" разделитель = "" показать обработчик = "ложь" updateVariableImmediately="true" variableName="ex7"/> В этом примере: - извлечение макроса не обрабатывается обработчиком макроса (showHandler="ложь") - извлеченные данные сохраняются в HATS global переменная "ex7" (сохранить = "true" и variableName = "ex7") - глобальная переменная HATS обновляется немедленно с извлеченными данными (updateVariableImmediately="true") Атрибут updateVariableImmediately не действует, если извлеченные данные не хранится в глобальной переменной HATS.Если updateVariableImmediately не указан, используется значение false. Временное исправление
Комментарии
Информация об APAR
Номер APAR
IC80794
Заявленное название компонента
RATL HATS TOOLK
Идентификатор сообщаемого компонента
5724U6801
Сообщенный выпуск
750
Статус
ЗАКРЫТО ПО
Полиэтилен
Нет полиэтилена
HIPER
Нет HIPER
Особое внимание
NoSpecatt
Дата отправки
12.01.2012
Дата закрытия
03.05.2012
Дата последнего изменения
03.05.2012
APAR sysrouted ИЗ одного или нескольких из следующих:
APAR sysrouted TO одному или нескольким из следующих:
Название фиксированного компонента
RATL HATS TOOLK
Идентификатор фиксированного компонента
5724U6801
Применимые уровни компонентов
R710 PSY
UP
R800 PSY
UP
[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSXKAY","label":"IBM Host Access Transformation Services"},"Компонент":"","Категория ARM":[],"Платформа":[{"код":"PF025","метка":"Независимая от платформы"}],"Версия": "7.5","Edition":"","Line of Business":{"code":"LOB35","label":"Mainframe SW"}}]
Android.mk | НДК для Android | Разработчики Android
На этой странице описывается синтаксис файла сборки
Android.mk
, используемогоndk-сборка
.Обзор
Файл
Android.mk
находится в подкаталоге вашего проектаjni/
. каталог и описывает ваши исходники и общие библиотеки для системы сборки.На самом деле это крошечный фрагмент make-файла GNU, который система сборки анализирует один или несколько раз. более. ФайлAndroid.mk
полезен для определения параметров всего проекта, которыеApplication.mk
, система сборки и переменные вашей среды оставляются неопределенный. Он также может переопределять общие настройки проекта для конкретных модулей .Синтаксис
Android.mk
позволяет сгруппировать ваши источники в модуля . Модуль может быть статической библиотекой, разделяемой библиотекой или отдельной библиотекой. исполняемый.Вы можете определить один или несколько модулей в каждом файлеAndroid.mk
и вы можете использовать один и тот же исходный файл в нескольких модулях. Только система сборки помещает общие библиотеки в пакет вашего приложения. Кроме того, статический библиотеки могут генерировать разделяемые библиотеки.В дополнение к библиотекам упаковки система сборки обрабатывает множество других подробности для вас. Например, вам не нужно перечислять файлы заголовков или явные зависимости между сгенерированными файлами в вашем Android
.файл мк
. Сборка НДК система вычисляет эти отношения автоматически для вас. В результате вы должны иметь возможность извлечь выгоду из поддержки новой цепочки инструментов / платформы в будущем NDK выпуски без необходимости прикасаться к файлуAndroid.mk
.Синтаксис этого файла очень близок к тому, что используется в файлах
Android.mk
. распространяется с полным проектом Android с открытым исходным кодом. Пока система сборки реализация, которая их использует, отличается, их сходство является преднамеренным дизайнерское решение, направленное на то, чтобы упростить повторное использование разработчиками приложений. исходный код для внешних библиотек.Основы
Перед детальным изучением синтаксиса полезно начать с понимания основы того, что содержит файл
Android.mk
. В этом разделе используетсяФайл Android.mk
в образце Hello-JNI с этой целью, объясняющий роль что воспроизводится каждая строка в файле.Файл
Android.mk
должен начинаться с определения переменнойLOCAL_PATH
:LOCAL_PATH := $(вызвать мой каталог)
Эта переменная указывает расположение исходных файлов в разработке дерево.Здесь функция макроса
my-dir
, предоставленная системой сборки, возвращает путь к текущему каталогу (каталог, содержащийAndroid.mk
сам файл).В следующей строке объявляется переменная
CLEAR_VARS
, значение которой система сборки обеспечивает.включают $(CLEAR_VARS)
Переменная
CLEAR_VARS
указывает на специальный файл Makefile GNU, который очищает многиеLOCAL_XXX
переменных для вас, таких какLOCAL_MODULE
,LOCAL_SRC_FILES
иЛОКАЛЬНЫЕ_СТАТИЧЕСКИЕ_БИБЛИОТЕКИ
.Обратите внимание, что он не очищаетLOCAL_PATH
. Этот переменная должна сохранить свое значение, потому что система анализирует все файлы управления сборкой в одном контексте выполнения GNU Make, где все переменные являются глобальными. Ты должен (повторно) объявляйте эту переменную перед описанием каждого модуля.Далее в переменной
LOCAL_MODULE
хранится имя модуля, который вы хотите строить. Используйте эту переменную один раз для каждого модуля в вашем приложении.LOCAL_MODULE := привет-jni
Каждое имя модуля должно быть уникальным и не содержать пробелов.Система сборки, когда он генерирует окончательный файл общей библиотеки, автоматически добавляет правильный префикс и суффикс имени, которое вы назначаете
Примечание: Если имя вашего модуля уже начинается сLOCAL_MODULE
. Например, приведенный выше пример приводит к созданию библиотеки с именемlibhello-jni.so
.lib
, система сборки не добавьте дополнительный префиксlib
; он берет имя модуля как есть и добавляет.поэтому расширение
. Таким образом, исходный файл изначально назывался, например,libfoo.c
. по-прежнему создает файл общих объектов с именемlibfoo.so
. Это поведение должно библиотеки поддержки, которые исходники платформы Android генерируют изAndroid.mk
файлы; имена всех таких библиотек начинаются сlib
.В следующей строке перечисляются исходные файлы с пробелами, разделяющими несколько файлы:
LOCAL_SRC_FILES := привет-jni.c
Переменная
LOCAL_SRC_FILES
должна содержать список исходных файлов C и/или C++. для сборки в модуль.Последняя строка помогает системе связать все воедино:
включает $(BUILD_SHARED_LIBRARY)
Переменная
BUILD_SHARED_LIBRARY
указывает на скрипт GNU Makefile, который собирает всю информацию, определенную вами впеременных LOCAL_XXX
, начиная с самого последниевключают
. Этот сценарий определяет, что строить и как это делать.В каталогах примеров есть более сложные примеры с комментариями
Андроид.mk
файлы, которые вы можете посмотреть. Кроме того, образец: нативная активность предоставляет подробное объяснение файлаAndroid.mk
этого образца. Ну наконец то, Переменные и макросы предоставляют дополнительную информацию о переменных из этого раздел.Переменные и макросы
Система сборки предоставляет множество возможных переменных для использования в файле
Android.mk
. Многие из этих переменных имеют предустановленные значения. Другие, вы назначаете.В дополнение к этим переменным вы также можете определить свои собственные произвольные переменные.Если вы это сделаете, держите Имейте в виду, что система сборки NDK резервирует следующие имена переменных:
- Имена, начинающиеся с
LOCAL_
, напримерLOCAL_MODULE
.- Имена, начинающиеся с
PRIVATE_
,NDK_
илиAPP
. Система сборки использует эти внутри.- Имена в нижнем регистре, например
my-dir
. Система сборки использует их внутренне, т.к. Что ж.Если вам нужно определить свои собственные переменные удобства в
Android.файл mk
, мы рекомендуется добавлятьMY_
к их именам.Включаемые переменные, определенные NDK
В этом разделе обсуждаются переменные GNU Make, которые определяет система сборки. прежде чем анализировать файл
Android.mk
. При определенных обстоятельствах NDK может несколько раз проанализировать ваш файлAndroid.mk
, используя другое определение для некоторых из этих переменных каждый раз.CLEAR_VARS
Эта переменная указывает на скрипт сборки, который отменяет определение почти всех
LOCAL_XXX
переменные, перечисленные в разделе «Переменные, определяемые разработчиком» ниже.Использовать это переменная для включения этого скрипта перед описанием нового модуля. Синтаксис для используя это:включают $(CLEAR_VARS)
BUILD_EXECUTABLE
Эта переменная указывает на скрипт сборки, который собирает всю информацию о модуль, указанный вами в переменных
LOCAL_XXX
, и определяет, как создайте целевой исполняемый файл из перечисленных вами источников. Обратите внимание, что с помощью этого script требует, чтобы вы уже присвоили значенияLOCAL_MODULE
иLOCAL_SRC_FILES
, как минимум (дополнительную информацию об этих переменных см. переменные описания модуля).Синтаксис для использования этой переменной:
Примечание: Большинство приложений для Android не содержат исполняемых файлов, но они полезны для создание модульных тестов и других инструментов отладки.включает $(BUILD_EXECUTABLE)
BUILD_SHARED_LIBRARY
Эта переменная указывает на скрипт сборки, который собирает всю информацию о модуль, указанный вами в переменных
LOCAL_XXX
, и определяет, как создайте целевую общую библиотеку из перечисленных вами источников.Обратите внимание, что с помощью этого script требует, чтобы вы уже присвоили значенияLOCAL_MODULE
иLOCAL_SRC_FILES
, как минимум (дополнительную информацию об этих переменных см. переменные описания модуля).Синтаксис для использования этой переменной:
включает $(BUILD_SHARED_LIBRARY)
Переменная общей библиотеки заставляет систему сборки создавать файл библиотеки с расширением
.so
.BUILD_STATIC_LIBRARY
Вариант
.BUILD_SHARED_LIBRARY
, который используется для создания статической библиотеки.То система сборки не копирует статические библиотеки в ваш проект/пакеты, но можно использовать их для создания разделяемых библиотек (см.LOCAL_STATIC_LIBRARIES
иLOCAL_WHOLE_STATIC_LIBRARIES
, ниже). Синтаксис использования этой переменной:включает $(BUILD_STATIC_LIBRARY)
Переменная статической библиотеки заставляет систему сборки создавать библиотеку с
.a
расширение.ПРЕДВАРИТЕЛЬНАЯ_ОБЩАЯ_БИБЛИОТЕКА
Указывает на сценарий сборки, используемый для указания предварительно созданной общей библиотеки.В отличие от в случае
BUILD_SHARED_LIBRARY
иBUILD_STATIC_LIBRARY
здесь значениеLOCAL_SRC_FILES
не может быть исходным файлом. Вместо этого это должен быть единственный путь к готовая разделяемая библиотека, напримерfoo/libfoo.so
. Синтаксис для использования этого переменная:включает $(PREBUILT_SHARED_LIBRARY)
Вы также можете ссылаться на готовую библиотеку в другом модуле, используя
LOCAL_PREBUILTS
переменная.Дополнительные сведения об использовании готовых сборок см. Используйте готовые библиотеки.ПРЕДВАРИТЕЛЬНАЯ_СТАТИЧЕСКАЯ_БИБЛИОТЕКА
То же, что и
PREBUILT_SHARED_LIBRARY
, но для предварительно созданной статической библиотеки. За Дополнительные сведения об использовании готовых библиотек см. в разделе Использование готовых библиотек.Переменные информации о цели
Система сборки анализирует
Android.mk
один раз для каждого ABI, указанного вAPP_ABI
переменная, которая обычно определяется в приложении.файл мк
. ЕслиAPP_ABI
isall
, тогда система сборки анализируетAndroid.mk
один раз для каждого ABI NDK поддерживает. В этом разделе описываются переменные, которые система сборки определяет каждый раз, когда разбираетAndroid.mk
.TARGET_ARCH
Семейство ЦП, на которое нацелена система сборки при анализе этого
Android.mk
файл. Эта переменная будет одной из следующих:arm
,arm64
,x86
илиx86_64
.ЦЕЛЬ_ПЛАТФОРМА
Номер уровня Android API, на который ориентируется система сборки при анализе этого
Файл Android.mk
. Например, образы системы Android 5.1 соответствуют Android API уровня 22:android-22
. Полный список названий платформ и соответствующие образы системы Android, см. Собственные API. То следующий пример показывает синтаксис для использования этой переменной:ifeq ($(TARGET_PLATFORM),android-22) # ... сделай что-нибудь ... конец
TARGET_ARCH_ABI
ABI, на который нацелена система сборки, когда анализирует этот файл
Android.mk
. В таблице 1 показаны настройки ABI, используемые для каждого поддерживаемого процессора и архитектуры.Таблица 1. Настройки ABI для различных процессоров и архитектур.
ЦП и архитектура Настройка ARMv7 армеаби-v7a
ARMv8 AArch64 арм64-в8а
i686 x86
x86-64 x86_64
В следующем примере показано, как проверить ARMv8 AArch64 в качестве цели Комбинация ЦП и ABI:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a) # ... сделай что-нибудь ... конец
Дополнительные сведения об архитектуре ABI и связанных с ней проблемах совместимости см. обратитесь к Android ABI.
Новые целевые ABI в будущем будут иметь другие значения.
TARGET_ABI
Объединение целевого уровня Android API и ABI. Это особенно полезно когда вы хотите протестировать конкретный образ целевой системы для реального устройства. Например, чтобы проверить наличие 64-разрядного устройства ARM, работающего на Android API уровня 22:
.ifeq ($(TARGET_ABI),android-22-arm64-v8a) # ... сделай что-нибудь ... конец
Переменные описания модуля
Переменные в этом разделе описывают ваш модуль в системе сборки. Каждый описание модуля должно следовать этому основному потоку:
- Инициализировать или отменить определение переменных, связанных с модулем, с помощью
CLEAR_VARS
переменная.- Присвойте значения переменным, используемым для описания модуля.
- Настройте систему сборки NDK на использование соответствующего сценария сборки для модуля, используя переменную
BUILD_XXX
.ЛОКАЛЬНЫЙ_ПУТЬ
Эта переменная используется для указания пути к текущему файлу. Вы должны определить это в начале вашего файла
Android.mk
. В следующем примере показано, как сделать так:LOCAL_PATH := $(вызвать мой каталог)
Сценарий, на который указывает
CLEAR_VARS
, не очищает эту переменную. Следовательно, вам нужно определить его только один раз, даже если ваш файлAndroid.mk
описывает несколько модулей.ЛОКАЛЬНЫЙ_МОДУЛЬ
В этой переменной хранится имя вашего модуля.Он должен быть уникальным среди всех модулей имена и не должны содержать пробелов. Вы должны определить его перед включением любого скрипты (кроме
CLEAR_VARS
). Вам не нужно добавлять ниlib
префикс или расширение файла.so
или.a
; система сборки делает их модификации автоматически. На протяжении всего вашегоAndroid.mk
иApplication.mk
файлов, обращайтесь к вашему модулю по его немодифицированному имени. Например, следующее строка приводит к созданию модуля разделяемой библиотеки с именемlibfoo.так
:ЛОКАЛЬНЫЙ_МОДУЛЬ := "фу"
Если вы хотите, чтобы сгенерированный модуль имел имя, отличное от
lib
+ значениеLOCAL_MODULE
, вы можете использовать переменнуюLOCAL_MODULE_FILENAME
, чтобы задать сгенерированному модулю имя по вашему выбору.ЛОКАЛЬНЫЙ_МОДУЛЬ_ИМЯ_ФАЙЛА
Эта необязательная переменная позволяет вам переопределить имена, которые система сборки использует по умолчанию для файлов, которые он генерирует. Например, если имя вашего
LOCAL_MODULE
- этоfoo
, вы можете заставить систему вызывать файл, который она генерируетlibnewfoo
.В следующем примере показано, как это сделать:ЛОКАЛЬНЫЙ_МОДУЛЬ := foo LOCAL_MODULE_FILENAME := libnewfoo
Для модуля общей библиотеки в этом примере будет создан файл с именем
Примечание: Вы не можете переопределить путь к файлу или расширение файла.libnewfoo.so
.ЛОКАЛЬНЫЕ_SRC_ФАЙЛЫ
Эта переменная содержит список исходных файлов, которые система сборки использует для сгенерировать модуль. Перечислите только файлы, которые система сборки фактически передает компилятору, так как система сборки автоматически вычисляет любые связанные зависимости.Обратите внимание, что вы можете использовать как относительный (до
LOCAL_PATH
), так и абсолютный пути к файлам.Мы рекомендуем избегать абсолютных путей к файлам; относительные пути делают ваш
Примечание. Всегда используйте косую черту (/) в стиле Unix в файлах сборки. Сборка система неправильно обрабатывает обратную косую черту (\) в стиле Windows.Android.mk
файл более переносимый.ЛОКАЛЬНОЕ_CPP_EXTENSION
Вы можете использовать эту необязательную переменную, чтобы указать расширение файла, отличное от
.cpp
для исходных файлов C++. Например, следующая строка изменяет расширение до.cxx
. (Настройка должна включать точку.)LOCAL_CPP_EXTENSION := .cxx
Вы можете использовать эту переменную для указания нескольких расширений. Например:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
МЕСТНЫЕ_CPP_FEATURES
Вы можете использовать эту необязательную переменную, чтобы указать, что ваш код зависит от определенных Возможности С++.Он включает правильные флаги компилятора и компоновщика во время сборки. процесс. Для предварительно собранных двоичных файлов эта переменная также объявляет, какие функции двоичный файл зависит от , что помогает обеспечить правильную работу окончательной компоновки. Мы рекомендуется использовать эту переменную вместо включения
-frtti
и-fexceptions
непосредственно в вашем определенииLOCAL_CPPFLAGS
.Использование этой переменной позволяет системе сборки использовать соответствующие флаги для каждый модуль. Использование
LOCAL_CPPFLAGS
заставляет компилятор использовать все указанные флаги для всех модулей, независимо от фактической необходимости.Например, чтобы указать, что ваш код использует RTTI (информация о типе времени выполнения), написать:
LOCAL_CPP_FEATURES := rtti
Чтобы указать, что ваш код использует исключения C++, напишите:
LOCAL_CPP_FEATURES := исключения
Вы также можете указать несколько значений для этой переменной. Например:
LOCAL_CPP_FEATURES := функции rtti
Порядок описания значений не имеет значения.
LOCAL_C_INCLUDES
Эту необязательную переменную можно использовать для указания списка путей относительно NDK
корневой каталог
, для добавления в путь поиска include при компиляции всех исходники (C, C++ и ассемблер). Например:LOCAL_C_INCLUDES := источники/foo
Или даже:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<подкаталог>/foo
Определите эту переменную перед установкой любых соответствующих флагов включения через
LOCAL_CFLAGS
илиLOCAL_CPPFLAGS
.Система сборки также автоматически использует пути
LOCAL_C_INCLUDES
при запуске встроенная отладка с помощью ndk-gdb.ЛОКАЛЬНЫЕ_CFLAGS
Эта необязательная переменная устанавливает флаги компилятора для передачи системой сборки при создание исходных файлов C и C++. Возможность сделать это может быть полезна для указание дополнительных определений макросов или параметров компиляции. Используйте
LOCAL_CPPFLAGS
чтобы указать флаги только для C++.Старайтесь не менять уровень оптимизации/отладки в Android
.файл мк
. Система сборки может автоматически обрабатывать этот параметр для вас, используя соответствующую информацию в файлеApplication.mk
. Такой способ позволяет построить систему для создания полезных файлов данных, используемых во время отладки.Можно указать дополнительные включаемые пути, написав:
LOCAL_CFLAGS += -I<путь>,
Однако для этой цели лучше использовать
LOCAL_C_INCLUDES
, т.к. поэтому также позволяет использовать пути, доступные для собственной отладки с помощью ндк-ГДБ.LOCAL_CPPFLAGS
Необязательный набор флагов компилятора, который будет передан при сборке исходного кода C++. файлы только . Они появятся после
LOCAL_CFLAGS
на странице компилятора. командная строка. ИспользуйтеLOCAL_CFLAGS
, чтобы указать флаги как для C, так и для C++.ЛОКАЛЬНЫЕ_СТАТИЧЕСКИЕ_БИБЛИОТЕКИ
В этой переменной хранится список модулей статических библиотек, на которых модуль зависит.
Если текущий модуль является разделяемой библиотекой или исполняемым файлом, эта переменная принудительно скомпоновать эти библиотеки в результирующий двоичный файл.
Если текущий модуль является статической библиотекой, эта переменная просто указывает, что другие модули в зависимости от текущего также будут зависеть от перечисленных библиотеки.
ЛОКАЛЬНЫЕ_ОБЩИЕ_БИБЛИОТЕКИ
Эта переменная представляет собой список разделяемых библиотек модулей на которых этот модуль зависит во время выполнения. Эта информация необходима во время компоновки и для внедрения соответствующую информацию в сгенерированном файле.
LOCAL_WHOLE_STATIC_LIBRARIES
Эта переменная является вариантом
LOCAL_STATIC_LIBRARIES
и выражает, что компоновщик должен обрабатывать связанные библиотечные модули как целых архива .За дополнительную информацию о целых архивах см. в документации GNU ld для--целоархив
флаг.Эта переменная полезна при циклических зависимостях между несколькими статические библиотеки. Когда вы используете эту переменную для создания разделяемой библиотеки, она заставить систему сборки добавить все объектные файлы из ваших статических библиотек в конечный двоичный файл. Однако это не так при создании исполняемых файлов.
ЛОКАЛЬНЫЕ_LDLIBS
Эта переменная содержит список дополнительных флагов компоновщика для использования при построении ваша общая библиотека или исполняемый файл.Это позволяет использовать префикс
-l
для передачи имя конкретных системных библиотек. Например, следующий пример говорит компоновщик для создания модуля, который ссылается на/system/lib/libz.so
при загрузке время:LOCAL_LDLIBS := -lz
Для списка открытых системных библиотек, на которые вы можете ссылаться в этом NDK. выпуск, см. Собственные API.
Примечание: Если вы определяете эту переменную для статической библиотеки, система сборки игнорирует это, аndk-build
выводит предупреждение.ЛОКАЛЬНЫЕ_LDFLAGS
Список других флагов компоновщика, которые система сборки должна использовать при сборке вашего общая библиотека или исполняемый файл. Например, чтобы использовать компоновщик
ld.bfd
на ARM/X86:Примечание: Если вы определяете эту переменную для статической библиотеки, система сборки игнорирует это, и ndk-build выводит предупреждение.LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
По умолчанию, когда система сборки обнаруживает неопределенную ссылку при попытке создать общий ресурс выдается ошибка undefined symbol .Этот error может помочь вам обнаружить ошибки в исходном коде.
Чтобы отключить эту проверку, установите для этой переменной значение
Примечание: Если вы определяете эту переменную для статической библиотеки, система сборки игнорирует это, и ndk-build выводит предупреждение.true
. Обратите внимание, что этот параметр может вызвать загрузку общей библиотеки во время выполнения.ЛОКАЛЬНЫЙ_ARM_MODE
По умолчанию система сборки создает целевые двоичные файлы ARM в режиме thumb , где каждая инструкция имеет ширину 16 бит и связана с библиотеками STL в
thumb/
каталог.Определение этой переменной какarm
заставляет систему сборки генерировать объектные файлы модуля в 32-битном режимеarm
. Следующий пример показывает, как это сделать:LOCAL_ARM_MODE := постановка на охрану
Вы также можете указать системе сборки собирать только определенные источники в
arm
режиме, добавив суффикс.arm
к именам исходных файлов. Например, следующий пример указывает системе сборки всегда компилироватьbar.c
в режиме ARM, но построитьfoo.c
в соответствии со значениемLOCAL_ARM_MODE
.Примечание: Вы также можете заставить систему сборки генерировать двоичные файлы ARM, установивLOCAL_SRC_FILES := foo.c bar.c.arm
APP_OPTIM
в файлеApplication.mk
доdebug
. Указаниеотладки
форсирует сборку ARM, потому что отладчик набора инструментов не обрабатывает код Thumb правильно.МЕСТНЫЙ_ARM_NEON
Эта переменная имеет значение, только если вы ориентируетесь на
armeabi-v7a
ABI.Это позволяет использовать встроенные функции компилятора ARM Advanced SIMD (NEON) в ваших C и C++ исходники, а также инструкции NEON в файлах сборки.Обратите внимание, что не все процессоры на базе ARMv7 поддерживают расширения набора инструкций NEON. По этой причине вы должны выполнять обнаружение во время выполнения, чтобы иметь возможность безопасно использовать этот код во время выполнения. Дополнительные сведения см. в разделе Поддержка Neon и Особенности процессора.
Кроме того, вы можете использовать суффикс
.neon
, чтобы указать, что система сборки компилируйте только определенные исходные файлы с поддержкой NEON.В следующем примере система сборки компилируетfoo.c
с поддержкой большого пальца и неона,bar.c
с поддержка большого пальца иzoo.c
с поддержкой ARM и NEON:LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
Если вы используете оба суффикса,
.arm
должен предшествовать.neon
.LOCAL_DISABLE_FORMAT_STRING_CHECKS
По умолчанию система сборки компилирует код с защитой строки формата.Делает поэтому вызывает ошибку компилятора, если строка непостоянного формата используется в
printf Функция в стиле
. Эта защита включена по умолчанию, но вы можете отключить это, установив значение этой переменной вtrue
. Мы не рекомендуем этого делать без уважительной причины.LOCAL_EXPORT_CFLAGS
Эта переменная записывает набор флагов компилятора C/C++ для добавления к
LOCAL_CFLAGS
определение любого другого модуля, который использует этот черезLOCAL_STATIC_LIBRARIES
илиLOCAL_SHARED_LIBRARIES
переменных.Например, рассмотрим следующую пару модулей:
foo
иbar
, которые зависит отfoo
:включают $(CLEAR_VARS) LOCAL_MODULE := foo LOCAL_SRC_FILES := foo/foo.c LOCAL_EXPORT_CFLAGS := -DFOO=1 включить $(BUILD_STATIC_LIBRARY) включить $(CLEAR_VARS) LOCAL_MODULE := бар LOCAL_SRC_FILES := bar.c LOCAL_CFLAGS := -DBAR=2 LOCAL_STATIC_LIBRARIES := foo включить $(BUILD_SHARED_LIBRARY)
Здесь система сборки передает компилятору флаги
-DFOO=1
и-DBAR=2
. при построениибар.с
. Он также добавляет экспортированные флаги к вашему модулю.LOCAL_CFLAGS
, чтобы вы могли легко переопределить их.Кроме того, отношения между модулями транзитивны: если
зоопарк
зависит отbar
, который в свою очередь зависит отfoo
, тоzoo
тоже наследует все флаги экспортировано изfoo
.Наконец, система сборки не использует экспортированные флаги при локальной сборке. (т. е. создание модуля, чьи флаги он экспортирует).Таким образом, в примере выше, он не передает
-DFOO=1
компилятору при сборкеfoo/foo.c
. К строить локально, вместо этого используйтеLOCAL_CFLAGS
.LOCAL_EXPORT_CPPFLAGS
Эта переменная аналогична
LOCAL_EXPORT_CFLAGS
, но только для флагов C++.LOCAL_EXPORT_C_INCLUDES
Эта переменная такая же, как
LOCAL_EXPORT_CFLAGS
, но для C включает пути. Это полезно в тех случаях, когда, например,бар.c
должен включать заголовки из модульfoo
.LOCAL_EXPORT_LDFLAGS
Эта переменная такая же, как
LOCAL_EXPORT_CFLAGS
, но для флагов компоновщика.LOCAL_EXPORT_LDLIBS
Эта переменная аналогична
LOCAL_EXPORT_CFLAGS
и указывает системе сборки передавать имена определенных системных библиотек компилятору. Добавьте-l
к имя каждой указанной вами библиотеки.Обратите внимание, что система сборки добавляет импортированные флаги компоновщика к значению вашего переменная
LOCAL_LDLIBS
модуля.Это происходит благодаря тому, как работают компоновщики Unix.Эта переменная обычно полезна, когда модуль
foo
является статической библиотекой и имеет код, который зависит от системной библиотеки. Затем вы можете использоватьLOCAL_EXPORT_LDLIBS
для для экспорта зависимости. Например:включают $(CLEAR_VARS) LOCAL_MODULE := foo LOCAL_SRC_FILES := foo/foo.c LOCAL_EXPORT_LDLIBS := -llog включить $(BUILD_STATIC_LIBRARY) включить $(CLEAR_VARS) LOCAL_MODULE := бар LOCAL_SRC_FILES := панель.с LOCAL_STATIC_LIBRARIES := foo включить $(BUILD_SHARED_LIBRARY)
В этом примере система сборки помещает
-llog
в конце команды компоновщика. когда он собираетlibbar.so
. Это сообщает компоновщику, что, посколькуlibbar.so
зависит отfoo
, а также от библиотеки системного ведения журнала.ЛОКАЛЬНЫЕ_КОРОТКИЕ_КОМАНДЫ
Установите для этой переменной значение
true
, если ваш модуль имеет очень большое количество источников. и/или зависимые статические или разделяемые библиотеки.Это заставляет систему сборки используйте синтаксис@
для архивов, содержащих промежуточные объектные файлы или ссылки библиотеки.Эта функция может быть полезна в Windows, где командная строка принимает максимум всего из 8191 символа, что может быть слишком мало для сложных проектов. Это также влияет на компиляцию отдельных исходных файлов, помещая почти все файлы компилятора флаги внутри файлов списков тоже.
Обратите внимание, что любое значение, отличное от
true
, вернется к поведению по умолчанию.Ты также можно определитьAPP_SHORT_COMMANDS
в файлеApplication.mk
для принудительного это поведение для всех модулей в вашем проекте.Мы не рекомендуем включать эту функцию по умолчанию, так как она делает сборку помедленнее.
ЛОКАЛЬНЫЙ_THIN_АРХИВ
Установите для этой переменной значение
true
при построении статических библиотек. Это будет сгенерировать тонкий архив , файл библиотеки, не содержащий объектных файлов, но вместо этого просто пути к файлам к фактическим объектам, которые обычно содержать.Это полезно для уменьшения размера выходных данных сборки. Недостаток в том, что такие библиотеки нельзя переместить в другое место (все пути внутри них являются относительными).
Допустимые значения:
Примечание: игнорируется для нестатических библиотечных модулей или готовых статических библиотек. те.true
,false
или пустые. Значение по умолчанию может быть установлено в вашемФайл Application.mk
через переменнуюAPP_THIN_ARCHIVE
.ЛОКАЛЬНЫЙ_ФИЛЬТР_АСМ
Определите эту переменную как команду оболочки, которую система сборки будет использовать для фильтрации файлы сборки, извлеченные или сгенерированные из файлов, которые вы указали для
ЛОКАЛЬНЫЕ_SRC_ФАЙЛЫ
. Определение этой переменной вызывает следующие события:
- Система сборки создает временный файл сборки из любого источника C или C++ файл, вместо того, чтобы компилировать их в объектный файл.
- Система сборки выполняет команду оболочки в
LOCAL_FILTER_ASM
на любом временный файл сборки и любой файл сборки, указанный вLOCAL_SRC_FILES
, таким образом создается еще один временный файл сборки.- Система сборки компилирует эти отфильтрованные файлы сборки в объектный файл.
Например:
LOCAL_SRC_FILES := foo.c bar.S ЛОКАЛЬНЫЙ_ФИЛЬТР_АСМ := foo.c --1--> $OBJS_DIR/foo.S.original --2--> $OBJS_DIR/foo.S --3--> $OBJS_DIR/foo.o bar.S --2--> $OBJS_DIR/bar.S --3--> $OBJS_DIR/bar.o
«1» соответствует компилятору, «2» — фильтру, «3» — ассемблеру. Фильтр должен быть отдельной командой оболочки, которая принимает имя ввода файл в качестве первого аргумента и имя выходного файла в качестве второго.Например:
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S myasmfilter bar.S $OBJS_DIR/bar.S
Функциональные макросы, предоставляемые NDK
В этом разделе объясняются макросы функций GNU Make, предоставляемые NDK. Использовать
$(вызов <функции>)
для их оценки; они возвращают текстовую информацию.мой-директор
Этот макрос возвращает путь к последнему включенному make-файлу, который обычно текущий каталог
Android.mk
.my-dir
полезен для определенияLOCAL_PATH
в начале вашего файлаAndroid.mk
. Например:LOCAL_PATH := $(вызвать мой каталог)
Из-за того, как работает GNU Make, этот макрос действительно возвращает путь к последний make-файл, который система сборки включила при разборе скриптов сборки. За по этой причине вы не должны вызывать
my-dir
после включения другого файла.Например, рассмотрим следующий пример:
LOCAL_PATH := $(вызвать мой каталог) # ... объявить один модуль включить $(LOCAL_PATH)/foo/`Android.mk` LOCAL_PATH := $(вызвать мой-каталог) # ... объявить еще один модуль
Проблема здесь в том, что второй вызов
my-dir
определяетLOCAL_PATH
как$PATH/foo
вместо$PATH
, потому что это было самое последнее включение заостренный.Вы можете избежать этой проблемы, поставив дополнительные включения после всего остального в файле
Android.mk
. Например:LOCAL_PATH := $(вызвать мой каталог) # ... объявить один модуль LOCAL_PATH := $(вызвать мой-каталог) # ... объявить еще один модуль # дополнительные включения в конце файла Android.mk включить $(LOCAL_PATH)/foo/Android.mk
Если структурировать файл таким образом невозможно, сохраните значение первый вызов
my-dir
в другую переменную. Например:MY_LOCAL_PATH := $(вызвать мой каталог) LOCAL_PATH: = $(MY_LOCAL_PATH) # ... объявить один модуль включить $(LOCAL_PATH)/foo/`Android.mk` LOCAL_PATH: = $(MY_LOCAL_PATH) # ... объявить другой модуль
все-подкаталоги makefiles
Возвращает список
файлов Android.mk
, расположенных во всех подкаталогах текущий путьmy-dir
.Вы можете использовать эту функцию, чтобы предоставить глубоко вложенные иерархии исходных каталогов для система сборки. По умолчанию NDK ищет файлы только в каталоге содержащий файл
Android.mk
.этот make-файл
Возвращает путь к текущему make-файлу (из которого система сборки вызвала функция).
родительский make-файл
Возвращает путь к родительскому make-файлу в дереве включения (путь makefile, который включал текущий).
прародительский make-файл
Возвращает путь к родительскому make-файлу в дереве включения (путь make-файл, который включал текущий).
импортный модуль
Функция, позволяющая найти и включить файл
Android.mk
модуля, название модуля.Типичный пример:$(вызов модуля импорта,<имя>)
В этом примере система сборки ищет модуль с тегом
Преобразование<имя>
в список каталогов, на которые ссылается ваша средаNDK_MODULE_PATH
ссылки на переменные и автоматически включает файлAndroid.mk
.данных с помощью макросов SPSS экономит невероятное количество времени!
Преобразование данныхДля правильного выполнения большинства многомерных методов ваши данные должны быть нормально распределены.
Преобразование (логарифм, квадратный корень и т. д.) раньше было для меня повседневным делом. Потребовалось бы некоторое усилие, чтобы создать новые переменные для десятков или около того, которые мне нужно было преобразовать. Использование макросов, которые я написал в SPSS, упрощает задачу! Я создал макрос SPSS, который будет преобразовывать список переменных (и добавлять префикс к их именам) для журналов, натуральных журналов, квадратных корней и т. д. Я также создал макрос, который выполняет все из них (просто чтобы получить немного сумасшедший)
Вот макросы SPSS, которые я написал
*//////преобразование данных//////////.ОПРЕДЕЛИТЬ !clog10 ( Vars=!CMDEND) Отключите ошибку. !DO !I !IN (!Vars). Вычислить !Concat(!I,"_l") =lg10(!I+1). Метка Var !Concat(!I,"_l") !Concat(!i," (l)"). Формат !Concat(!I,"_l") (F4.1). Ширина Var !Concat(!I,"_l") (5). !КОНЕЦ. Включите Ошибка. EXE. !КОНЕЦОПРЕДЕЛИТЬ. /*!clog10 Vars=включить атм. ОПРЕДЕЛИТЬ !clog10D ( Vars=!CMDEND) Отключите ошибку. !DO !I !IN (!Vars). Вычислить !Concat(!I,"_l") =lg10(!I+1). Метка Var !Concat(!I,"_l") !Concat(!i," (l)").Формат !Concat(!I,"_l") (F4.1). Ширина Var !Concat(!I,"_l") (5). !КОНЕЦ. Сопоставить файлы file=* / DROP !Vars . Включите Ошибка. EXE. !КОНЕЦОПРЕДЕЛИТЬ. /*!clog10D Vars=включить атм. ОПРЕДЕЛИТЬ !Ulog10 ( Vars=!CMDEND) !DO !I !IN (!Vars). Вычислить !Concat(!I,"_ul10") =10**(!I)-1. Метка Var !Concat(!I,"_ul10") !Concat(!i," (ul10)"). Формат !Concat(!I,"_ul10") (F8.0). Ширина Var !Concat(!I,"_ul10") (9). !КОНЕЦ. EXE. !КОНЕЦОПРЕДЕЛИТЬ. ОПРЕДЕЛИТЬ !cLogN ( Vars=!CMDEND) !DO !I !IN (!Vars).Вычислить !Concat(!I,"_ln") =ln(!I+1). Метка Var !Concat(!I,"_ln") !Concat(!i," (ln)"). Формат !Concat(!I,"_ln") (F4.1). Ширина Var !Concat(!I,"_ln") (5). !КОНЕЦ. EXE. !КОНЕЦОПРЕДЕЛИТЬ. Определить !ULogN ( Vars=!CMDEND) !DO !I !IN (!vars). Вычислить !Concat(!I,"_uln") =EXP(!I)-1. Метка Var !Concat(!I,"_uln") !Concat(!i," (uln)"). Формат !Concat(!I,"_uln") (F4.1). Ширина Var !Concat(!I,"_uln") (5). !КОНЕЦ. EXE. !КОНЕЦОПРЕДЕЛИТЬ.ОПРЕДЕЛИТЬ !csqrt (Vars=!CMDEND) !DO !I !IN (!vars). если !I=0 !Concat(!I,"_s") =0. Если !I<>0 !Concat(!I,"_s") =sqrt(!I). Метка Var !Concat(!I,"_s") !Concat(!i," (s)"). Формат !Concat(!I,"_s") (F4.1). Ширина Var !Concat(!I,"_s") (5). !КОНЕЦ. EXE. !КОНЕЦОПРЕДЕЛИТЬ. *////////////////. /*!cSqrt Vars=включить атм. *////////////////. ОПРЕДЕЛИТЬ !Usqrt (Vars=!CMDEND) !DO !I !IN (!Vars). Если !I=0 !Concat(!I,"_Us") =0. Если !I <>0 !Concat(!I,"_Us") =(!I*!I).Метка Var !Concat(!I,"_Us") !Concat(!i," (s)"). Формат !Concat(!I,"_Us") (F4.1). Ширина Var !Concat(!I,"_Us") (5). !КОНЕЦ.