Цитата AlekseyPopovv:
Error: label "YESREG:" already declared in section »
|
Препроцессор раскрывает !insertmacro в содержимое макроса. Поэтому, если макрос используется более одного раза в секции/функции, происходит дублирование меток и ошибка.
Возможные решения:
1. Применять функции.
Параметры передавать нужно через стек. А также делать раздельные функции для install/uninstall или писать дополнительную логику для объявления функции в install и/или uninstall.
2. Применять вызов через ${CallArtificialFunction} (Util.nsh)
Параметры передавать нужно через стек. Реализация через установку метки и Goto на неё делает невозможным воздействие на код макроса флагами извне отдельно на каждый вызов, но это скорее понадобится для создания библиотечных макросов со сложной логикой.
3. Добавить в качестве префикса к метке уникальное в пределах текущего вызова макроса значение.
LogicLib.nsh использует такой метод (но в отличной от примера реализации).
пример
Код:
![Выделить весь код](images/misc/selectcode.png)
!macro DigitIsOdd return value
; объявить префикс
!define LABEL__ ${__MACRO__}.__LABEL__.${__COUNTER__}
StrCmp '${value}' 1 ${LABEL__}YES 0
StrCmp '${value}' 3 ${LABEL__}YES 0
StrCmp '${value}' 5 ${LABEL__}YES 0
StrCmp '${value}' 7 ${LABEL__}YES 0
StrCmp '${value}' 9 ${LABEL__}YES 0
Goto ${LABEL__}NO
${LABEL__}YES:
StrCpy ${return} 'yes'
Goto ${LABEL__}EXIT
${LABEL__}NO:
StrCpy ${return} 'no'
${LABEL__}EXIT:
; удалить префикс
!undef LABEL__
!macroend
4. Изменить структуру кода, использовать LogicLib, если это возможно и не ухудшает читаемость кода.