在源代码中标记一个区域,该区域只有在逻辑条件求值为 TRUE 时才会被纳入编译。
#if <logical_expression>
<SourceCode included if <logical_expression> evaluates to .T.>
[ #else
<SourceCode included if <logical_expression> othwerwise>
]
#endif
<logical_expression> : <expression>
<expression> : <unary_operator> <expression> // 单词前缀表达式
| <expression> <binary_operator> <expression> // 二进制数值表达式
| <expression> <shift_operator> <expression> // 二进制移位表达式
| <expression> <comparison_operator> <expression> // 二进制逻辑表达式
| <expression> <bitwise_operator> <expression> // 二进 bitwise 表达式
| <expression> <logical_operator> <expression> // 二进制逻辑表达式
| <negation_operator> <expression> // 否定表达式
| <primary_expression> // primary 表达式
<unary_operator> : + | - | ++ | --
<binary_operator> : ^ | * | / | % | + | -
<shift_operator> : << | >>
<comparison_operator> : < | <= | > | >= | = | == | != | <>
<bitwise_operator> : & | |
<logical_operator> : .AND. | .OR. | .XOR.
<negation_operator> : ! | .NOT.
<primary_expression> : <literal_value> // 字面量表达式
| ( <expression> ) // 括号内的表达式
<literal_value> : <string_literal>
| <char_literal>
| <logical_literal>
| <integer>
| <double>
| <#define_constant>
<string_literal> : "double quoted"
| 'single_quoted'
| [block_quoted]
| e"escaped"
<char_literal> c'<char>'
<logical_literal> : .T. | TRUE | .F. | FALSE
#if...#else...#endif指令构成了预处理器的控制结构。
当 <logical_expression> 求值为 true (.T.) 时,预处理器将翻译并输出位于 #if 和 #else 指令之间的源代码到中间文件,而忽略位于 #else 和 #endif 指令之间的源代码。
如果没有 #else 指令,预处理器将翻译并输出位于指令 #if 和 #endif 之间的源代码。
如果 <logical_expression> 的值为 false (.F.),则只包含指令 #else 和 #endif 之间的源代码。
<logical_expression> 项可以使用操作数、比较运算符和逻辑运算符构成。比较运算总是需要两个操作数,并在逻辑运算之前进行评估。操作数必须是字符串字面量、数字字面量或逻辑字面量,或者是结果为上述字面量之一的有效 #define 常量。
当字符串被括入单引号或双引号时,将被识别。如果遇到未定义的常量,该术语的结果将是 false (.F.) 。
逻辑表达式由两个表达式和一个逻辑运算符组成,或者仅由一个字面量组成。
当表达式中混合了类型时,预处理器会自动按照以下顺序转换类型,以便进行比较和计算:
1. String
2. Double
3. Integer
4. Logic
示例
#if 1 > "abc"
// 在比较之前,先将 1 转换为 "1"
? "比较数字和字符串"
#endif
#if 1.2 > FALSE
// 在比较之前,先将 FALSE 转换为 0
? "比较数字和字符串"
#endif
如果一个操作数的类型为 |
然后对另一个操作数进行如下转换 |
String |
对值调用 .ToString() |
Double 或 Decimal |
Integer: ToDouble() |
Integer |
Logic: TRUE = 1, FALSE = 0 |
Logical (在 #if 行的表达式) |
String: Null 或 Empty = FALSE, 所有其他 = TRUE |
字符串比较是使用序数比较法进行大小写比较的。字符串比较不支持"="操作符,因为预处理器不知道您想使用的 "SetExact() "设置是什么。所有比较均使用 String.Compare() 完成。
在 FoxPro 方言中,运算符 NOT、AND、OR 和 XOR 也可用