如何在没有“声明之前可能使用”的错误的情况下访问本地范围内的全局变量?

时间:2014-05-13 14:34:24

标签: variables error-handling compiler-warnings autoit

我收到此警告:WARNING: $a possibly used before declaration.表示我的功能:

Func test()
    If (IsDeclared("a")) Then
        ConsoleWrite($a)
    Else
        ConsoleWrite("Not declared")
    EndIf
EndFunc

Global $a = "test"

test()

可以通过使用全局变量作为函数的参数来避免。但是我需要这个结构,因为它与文件操作有关,我不想在每次需要变量时执行它。

如何在不生成“可能在声明之前使用”-error?

的情况下执行此操作

2 个答案:

答案 0 :(得分:1)

首先,此警告由Au3Check.exe报告,该程序与AutoIt编译器本身分开。您会发现在打印此警告后您的程序仍将编译/运行。一种可能的解决方案是忽略它,或者不在代码上运行Au3Check(不推荐)。

如果您最后定义了函数,那么您的代码将正常工作。你可能已经意识到了这一点,我知道当你#include职能时,他们可能会处于最顶层。

另一种可能的解决方案,如果真的很烦人,就是使用Eval。我不建议这样做,因为它不需要,如果使用Au3Stripper(以前是混淆器)会破坏你的脚本,尽管你的代码已经被IsDeclared打破了。

您可能不会想到的解决方案(可能是最佳解决方案)就是使用Dim

Func test()
    If(IsDeclared("a")) Then
        Dim $a

        ConsoleWrite($a & @LF)
    Else
        ConsoleWrite("Not declared" & @LF)
    EndIf
EndFunc

Global $a = "test"

test()

基本上,Dim的行为类似于Local,除非在全局范围内已存在具有该名称的变量,在这种情况下它将被重用。

答案 1 :(得分:0)

  

我收到此警告:WARNING: $a possibly used before declaration.

AU3Check确定在声明之前访问的变量(按代码顺序)。在变量声明之前,它不知道包含函数没有被称为,因此会产生警告(而不是报告错误)。

在声明全局变量之后声明关于函数的访问是否会阻止AU3Check的警告。例如:

#AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7

Global $a = "test"

test()

Func test()
    If (IsDeclared("a")) Then
        ConsoleWrite($a)
    Else
        ConsoleWrite("Not declared")
    EndIf
EndFunc