레이블과는 다르게, 이름에서 알 수 있듯이 상대 분기는 호출된 상대 위치와 연관되어 있습니다. 레이블이 사용되는 어디든지 상대 분기를 사용할 수 있습니다. 상대 분기는 숫자로 표시됩니다. +1은 현재 인스트럭션에서 다음 인스트럭션으로 분기합니다. (기본 진행), +2는 첫번째 인스트럭션을 무시하고 두번째 인스트럭션으로 건너뜁니다. -2는 뒤로 두번째 인스트럭션으로 건너뜁니다. 그리고 +10은 9번째 인스트럭션까지 무시하고 10번째 인스트럭션으로 건너뜁니다.
인스트럭션이란 런타임 시 수행되는 모든 명령어들입니다. MessageBox, Goto, GetDLLVersion, FileRead, SetShellVarContext가 모두 인스트럭션입니다. 하지만 AddSize, Section, SectionGroup, SectionEnd, SetOverwrite (그리고 Compiler Flags의 모든 것), Name, SetFont, LangString은 컴파일 타임에 수행되기 때문에 인스트럭션이 아닙니다.
1 2 3 | Goto +2 MessageBox MB_OK "이 메시지 박스는 절대 볼 수 없습니다." MessageBox MB_OK "마지막 메시지가 건너뛰어졌기 때문에 이 메시지 박스가 나타납니다." |
1 2 3 4 5 6 | Goto +4 MessageBox MB_OK "다음 메시지 박스는 건너뛰어집니다." Goto +3 MessageBox MB_OK "이 메시지 박스는 절대 볼 수 없습니다." Goto -3 MessageBox MB_OK "완료" |
매크로 삽입은 상대 분기와 관련하여 한 개의 인스트럭션으로 간주되지 않습니다. 매크로는 상대 분기가 적용되기 전에 확장됩니다. 따라서 상대 분기는 삽입된 매크로 내부의 코드로 분기할 수 있습니다. 다음 코드는 매크로를 건너뛰지 않습니다. 고로 메시지 박스가 나타납니다.
1 2 3 4 5 6 7 | !macro relative_jump_test MessageBox MB_OK "first macro line" MessageBox MB_OK "second macro line" !macroend Goto +2 !insertmacro relative_jump_test |
매크로 적용 시 아래와 같이 매크로 부분만 붙여넣어 계산하면 쉽습니다.
1 2 3 | Goto +2 MessageBox MB_OK "first macro line" MessageBox MB_OK "second macro line" |