Show/Hide Toolbars

XSharp

用途

在源代码中标记一个区域,该区域只有在逻辑条件求值为 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()
Logical: TRUE = 1.0, FALSE = 0.0

Integer

Logic: TRUE = 1, FALSE = 0

Logical (在 #if 行的表达式)

String: Null 或 Empty = FALSE, 所有其他 = TRUE
Integer: 0 = FALSE, 所有其他 = TRUE
Double: 0.0 = FALSE, 所有其他 = TRUE

 

比较操作

字符串比较是使用序数比较法进行大小写比较的。字符串比较不支持"="操作符,因为预处理器不知道您想使用的 "SetExact() "设置是什么。所有比较均使用 String.Compare() 完成。

 

方言

在 FoxPro 方言中,运算符 NOT、AND、OR 和 XOR 也可用