Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 352
Благодарности: 193

Профиль | Отправить PM | Цитировать


Цитата AlekseyPopovv:
Error: label "YESREG:" already declared in section »
Препроцессор раскрывает !insertmacro в содержимое макроса. Поэтому, если макрос используется более одного раза в секции/функции, происходит дублирование меток и ошибка.

Возможные решения:

1. Применять функции.
Параметры передавать нужно через стек. А также делать раздельные функции для install/uninstall или писать дополнительную логику для объявления функции в install и/или uninstall.

2. Применять вызов через ${CallArtificialFunction} (Util.nsh)
Параметры передавать нужно через стек. Реализация через установку метки и Goto на неё делает невозможным воздействие на код макроса флагами извне отдельно на каждый вызов, но это скорее понадобится для создания библиотечных макросов со сложной логикой.

3. Добавить в качестве префикса к метке уникальное в пределах текущего вызова макроса значение.
LogicLib.nsh использует такой метод (но в отличной от примера реализации).
пример
Код: Выделить весь код
!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, если это возможно и не ухудшает читаемость кода.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:55, 26-10-2023 | #2818