# #Warn

启用或禁用特定条件下的警告, 这些条件可能会产生错误, 例如书写错误或缺少 "全局" 声明.

    #Warn WarningType, WarningMode

## 参数

WarningType

  类型: 字符串

  要启用或禁用的警告类型. 如果省略, 默认为 All.

  VarUnset: 在脚本开始运行之前, 为每个从未以下列任何方式使用的变量的第一个引用显示一个警告:

  - 作为一个直接的, 非动态赋值的目标, 如 `MyVar := ""`.
  - 与引用操作符一起使用(例如 `&MyVar`).
  - 直接传递给 IsSet(例如 `IsSet(MyVar)`).

  LocalSameAsGlobal: 在脚本开始运行之前, 为每个名称与全局变量相同但 未声明 的局部变量显示一个警告. 这是为了防止在试图访问全局变量之前, 忘记在函数中声明全局变量而导致的错误. 如果该变量确实是计划作为局部变量来使用, 那么可以使用诸如 `local x` 或 `static y` 这样的声明来抑制该警告.

  默认情况下, 这个警告是禁用的.

      #Warn
      g := 1
      ShowG() {       ; 即使从未调用这个函数也会显示警告.
          ;global g   ; <-- 访问全局变量时需要这行.
          g := 2
      }
      ShowG
      MsgBox g  ; 没有声明, 上面赋值的是局部变量 "g".

  Unreachable: 在脚本开始运行之前, 对紧跟在同一嵌套层的 `Return`, `Break`, `Continue`, `Throw` 或 `Goto` 之后的每一行发出警告, 除非该行是一个标签的目标. 任何这样的行都不会被执行.

  如果代码的目的是不可到达的 - 例如, 如果使用 `return` 暂时禁用一个代码块, 或者通过注释的方式暂时禁用热键或热字符串 - 可以考虑把不可到达的代码也注释掉. 另外, 也可以通过在第一行不可到达的代码上方定义一个标签来抑制警告.

  All: 将给定的 WarningMode 应用于所有支持的警告类型.

WarningMode

  类型: 字符串

  表示如何发送警告的值. 如果省略, 则默认为 MsgBox.

  MsgBox: 显示一个描述警告的消息框. 请注意, 一旦消息框被删除, 脚本将照常继续.

  StdOut: 将警告的描述发送到 stdout(程序的标准输出流), 以及文件名和行号. 这允许像 SciTE 这样的高级编辑器在不中断脚本的情况下捕获警告 - 用户可以在以后通过编辑器的输出窗格跳转到每个违规行.

  OutputDebug: 将警告的描述发送到调试器上显示. 如果调试器不是活动的, 则没有效果. 有关详情, 请参阅 OutputDebug.

  Off: 禁用给定 WarningType 的警告.

## 备注

默认情况下, 所有的警告都是启用的并且使用 MsgBox 模式, 除了 LocalSameAsGlobal, 它是禁用的.

对产生 VarUnset, LocalSameAsGlobal 和 Unreachable 警告的检查是在所有指令被解析后, 但在脚本执行前进行的. 因此, 在脚本中的位置并不重要(而且, 像其他指令一样, #Warn 不能被有条件地执行).

然而, 多个 #Warn 指令的顺序是很重要的: 最后出现的设置给定警告的指令决定了该警告的模式. 因此, 例如, 下面两个语句的综合效果是启用除 LocalSameAsGlobal 以外的所有警告:

    #Warn All
    #Warn LocalSameAsGlobal, Off

## 相关

局部和全局变量

## 示例

禁用所有警告. 不推荐.

    #Warn All, Off

启用每种警告并将它们显示到消息框中.

    #Warn

对于每一个与全局变量同名的未声明的局部变量, 向 OutputDebug 发送一个警告.

    #Warn UseUnsetLocal, OutputDebug

dftg