#Warn [v1.0.95.00+]

특정한 조건에 대한 경고를 켜고 끕니다. 철자오류가 있거나 선언이 없는 경우와 같이 에러를 나타낼 수도 있습니다.

#Warn WarningType, WarningMode

매개변수

WarningType

켜고 끌 경고의 종류. 생략하면, All이 기본값입니다.

UseUnsetLocal 또는 UseUnsetGlobal: 변수가 이전에 값이 할당되어 있지 않거나 VarSetCapacity()로 초기화되지 않은 채로 읽혀지면 경고를 보냅니다. 변수를 비울 목적이라면, 빈 문자열을 할당해 이 경고를 누르십시오. IsSet() can be used to determine whether reading a variable would raise this warning.

지역 변수와 전역 변수에 대하여 따로 경고 유형이 나눠집니다. 전역 변수는 영속적이고 스크립트-전체에 걸쳐 영향을 미치는 성질이 있으므로 미리 초기화하지 않고 사용하는 것이 보다 일반적이기 때문입니다. 이런 이유로, 어떤 스크립트 저자는 이런 종류의 경고를 지역 변수에는 켜고 전역 변수에는 끄고 싶어합니다.

#Warn
;y := ""  ; 이렇게 하면 경고를 누릅니다.
x := y    ; y에는 아직 값이 할당되지 않았습니다.

UseEnv: 환경 변수가 빈 스크립트 변수 대신에 자동으로 사용되면 경고를 보냅니다. 이런 일은 종종 환경 변수의 이름이 예상치 못하게 스크립트가 사용하는 변수에 일치할 때 일어납니다. 이 경고는 변수에 접근할 때 일어납니다. 그러나 스크립트에 #NoEnv가 켜져 있으면 절대로 일어나지 않습니다 (여러 가지 이유로 권장함).

#Warn
;#NoEnv             ; 이것을 추가해 "temp"가 환경 변수가 아니라고 밝히십시오.
;EnvGet temp, TEMP  ; 이렇게 하면 환경 변수의 값을 스크립트 변수 안으로 복사할 것입니다.
temp := ""          ; 이 줄을 삭제해도, temp는 여전히 값을 가지고 있습니다.
MsgBox % temp       ; 이것은 이름이 "TEMP"인 환경 변수에 접근합니다.

LocalSameAsGlobal: 스크립트가 실행을 시작하기 전에, 전역 변수와 이름이 같은 선언되지 않은 지역 변수에 대하여 경고를 보여줍니다. 이것은 깜박잊고 전역 변수를 함수 안에 선언한 다음, 거기에 접근을 시도하면 야기되는 에러를 방지하기 위한 목적입니다. 그 변수가 실제로 지역 변수이기를 의도했다면, local x 또는 static y와 같이 선언하여 경고를 누를 수 있습니다. This warning is never shown for variables inside a force-local function.

#Warn
g := 1
ShowG() {       ; 함수를 호출하지 않아도 경고가 나타납니다.
    ;global g   ; <-- 전역 변수에 접근하기 위해 필요합니다.
    MsgBox % g  ; 선언할 필요없이, "g"는 빈 지역 변수입니다.
}

ClassOverwrite [v1.1.27+]: Before the script starts to run, show a warning for each assignment targetting a class variable. For example, box := new Box will show a warning if Box is a class, since this would overwrite the class (within the super-global variable, Box). Warnings are also shown for output variables of commands, but not ByRef parameters. Warnings are not shown for nested classes or dynamic variable references.

Unreachable [v1.1.33+]: Before the script starts to run, show a warning for each line that immediately follows a Return, Break, Continue, Throw, Goto or Exit at the same nesting level, unless that line is the target of a label. Although this does not detect all unreachable code, it detects common errors such as:

If the code is intended to be unreachable - such as if a return has been used to temporarily disable a block of code, or a hotkey or hotstring has been temporarily disabled by commenting it out - consider commenting out the unreachable code as well. Alternatively, the warning can be suppressed by defining a label above the first unreachable line.

All: 주어진 WarningMode를 지원되는 모든 경고 유형에 적용합니다.

WarningMode

어떻게 경고를 보낼지 가리키는 값. 생략되면, 기본값은 MsgBox입니다.

MsgBox: 경고를 기술하는 메시지 박스를 보여줍니다. 메시지 박스를 묵살하면, 스크립트는 보통처럼 실행을 계속합니다.

StdOut [v1.1.04+]: 경고를 기술하는 말을 표준출력(stdout)으로 보냅니다 (프로그램의 표준 출력 스트림). 파일 이름과 줄 번호를 함께 보냅니다. 이 덕분에 SciTE같은 환상적인 편집기들은 스크립트를 방해하지 않고 경고를 나포할 수 있습니다 - 사용자는 나중에 편집기의 출력 판을 통하여 문제의 줄에 점프해 갈 수 있습니다.

OutputDebug: 화면에 보여주기 위해 경고 문구를 디버거에게 보냅니다. 디버거가 켜져 있지 않으면, 아무 효과가 없습니다. 더 자세한 정보는 OutputDebug를 참조하십시오.

Off: 주어진 WarningType의 경고를 끕니다.

논평

기본값으로, 모든 경고는 꺼져 있습니다.

경고는 실행시간에는 켜고 끌 수 없습니다; 설정은 스크립트가 적재될 때 결정됩니다. 그러므로, 스크립트에서 위치는 의미가 없습니다 (그리고, 다른 지시어처럼, #Warn은 조건적으로 실행할 수 없습니다).

그렇지만, 여러 #Warn 지시어의 순서는 의미가 있습니다: 마지막으로 나타나 주어진 경고를 설정한 지시어가 그 경고에 대한 모드를 결정합니다. 그래서, 예를 들어, UseEnv를 제외하고 아래의 두 서술문은 조합하여 모든 경고를 켠 효과가 있습니다:

#Warn All
#Warn UseEnv, Off

EnvSet EnvVar, 1
x := EnvVar       ; #NoEnv가 사용되지 않았으므로 문제가 없습니다.
x := NotAnEnvVar  ; 경고.

지역 변수와 전역 변수

예제

모든 경고를 끕니다. 이것이 기본 상태입니다.

#Warn All, Off

Enables every type of warning and shows each warning in a message box.

#Warn

Warns when a local variable is used before it is set and sends each warning to OutputDebug.

#Warn UseUnsetLocal, OutputDebug