Skip to content

#If...Then...#Else、#Const 指令

编译时有条件地包含或排除代码块的编译器指令,并定义用于测试这些条件的常量。与运行时的If...Then...ElseConst不同,这些指令在编译期间操作:非活动分支中的代码从编译输出中完全省略,不产生大小或运行时开销。

#If...Then...#Else 指令

语法:

#If expression Then
    statements
[ #ElseIf expression-n Then
    [ elseifstatements ] ] ...
[ #Else
    [ elsestatements ] ]
#End If

expression, expression-n
完全由条件编译常量、字面量和运算符组成的表达式,计算结果为TrueFalse
statements, elseifstatements, elsestatements
当对应expressionTrue时包含的源代码行或进一步的编译器指令。

该指令的行为与运行时If...Then...Else语句类似,但有以下差异:

  • 没有单行形式——#If#ElseIf#Else#End If必须各自出现在单独的行上。
  • 所有expressions都会被计算,无论选择了哪个分支,因此它们引用的每个常量都必须已定义。未定义的条件编译常量计算为Empty(即零),被视为False
  • 未选择分支中的代码从编译中移除而非在运行时跳过。在twinBASIC中,非活动代码甚至不被检查错误。IDE根据当前构建配置将非活动块显示为灰色。

INFO

Option Compare语句不影响#If/#ElseIf中的表达式。它们始终按Option Compare Text生效来计算。

#Const 指令

语法:

#Const constname = expression

constname
条件编译常量的名称;遵循标准变量命名约定。
expression
字面量、另一个条件编译常量,或使用算术或逻辑运算符(Is除外)的任意组合。不允许使用标准运行时常量(用Const声明的)。

使用#Const声明的条件编译常量对其出现的模块是私有的。项目范围的条件常量必须在项目的编译设置中定义——#Const不能创建它们。

条件编译常量始终在模块级计算,无论它们出现在代码中的什么位置;它们只能在#If/#ElseIf表达式中使用。

预定义编译器常量

twinBASIC提供了一组内置编译器常量——Win64Win32TWINBASICTWINBASIC_BUILDVBA7等。完整列表及各常量的含义请参见编译器常量页面。

示例

本示例使用Win64预定义常量选择特定平台的导入,并使用项目定义的DEBUG_BUILD常量仅在调试构建中启用额外日志记录。

vb
#Const DEBUG_BUILD = 1

#If Win64 Then
    ' 64-bit-only declarations.
    Import Library "/Miscellaneous/sqlite3_64.obj" As SQLITE3
#Else
    ' 32-bit fallback.
    Import Library "/Miscellaneous/sqlite3_32.obj" As SQLITE3
#End If

Public Sub DoWork()
#If DEBUG_BUILD Then
    Debug.Print "Entering DoWork at "; Now
#End If
    ' ...
End Sub

另请参阅

twinBASIC及其LOGO版权为作者"韦恩"所有