#If...Then...#Else、#Const 指令
在编译时有条件地包含或排除代码块的编译器指令,并定义用于测试这些条件的常量。与运行时的If...Then...Else和Const不同,这些指令在编译期间操作:非活动分支中的代码从编译输出中完全省略,不产生大小或运行时开销。
#If...Then...#Else 指令
语法:
#If expression Then
statements
[ #ElseIf expression-n Then
[ elseifstatements ] ] ...
[ #Else
[ elsestatements ] ]
#End If
- expression, expression-n
- 完全由条件编译常量、字面量和运算符组成的表达式,计算结果为True或False。
- statements, elseifstatements, elsestatements
- 当对应expression为True时包含的源代码行或进一步的编译器指令。
该指令的行为与运行时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提供了一组内置编译器常量——Win64、Win32、TWINBASIC、TWINBASIC_BUILD、VBA7等。完整列表及各常量的含义请参见编译器常量页面。
示例
本示例使用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另请参阅
- If...Then...Else 语句——运行时对应语句。
- Const 语句——#Const的运行时对应语句。
- 编译器常量——内置条件常量完整列表。