-vo8选项可启用与Visual-Objects兼容的预处理器行为。
-vo8[+|-]
+ | - | 指定 + 或 -vo8,可以改变预处理器的某些方面,使其行为类似于 Visual Objects。 |
与 Visual Objects 不同,X# 使用基于文件的预处理器,它具有 C、C++ 和 Clipper 等语言中传统预处理器的特征。-vo8 选项控制以下行为:
•大小写敏感
在传统的预处理器中,#define foo 1 和 #define FOO 2 分别声明两个独立的预处理器符号,因为预处理器符号是区分大小写的。
然而,在 Visual Objects 中,DEFINE foo := 1 和 DEFINE FOO := 2 声明的是同一个实体(由于实体声明重复,编译器会出错)。
在 X# 中,默认情况下,即禁用 -vo8(未使用或指定"-vo8-")时,预处理器符号始终区分大小写。启用 -vo8 时,符号的大小写敏感性由 -cs 选项的状态决定:
•启用 -cs 时,编译器将所有标识符和类型名都视为区分大小写,那么预处理器符号也仍然区分大小写
•当禁用 -cs 时,预处理器符号不区分大小写,行为方式与 VO 中相同。
因此,当启用 -vo8 而禁用 -cs 时,#define foo 1 和 #define FOO 2 声明了相同的预处理器符号(并且会因为重新定义而导致编译器警告)。
以下代码在 Visual Objects 中有效:
DEFINE foo := "bar"
? Foo // "bar"
但以下代码会在 ? Foo 会引发未知变量错误,因为 X# 预处理器默认情况下是区分大小写的:
#define foo "bar"
? Foo
使用 -vo8(而不是 -cs)选项可以编译上述示例。除了使用 -vo8,还可以修改代码,使要替换文本的大小写与 #define 中使用的大小写一致。
•#ifdef
在传统的预处理器中,#ifdef ... #endif(或 #else)代码块中的代码如果在 #ifdef 之后定义了符号,就会被编译。#endif(或 #else)代码块中的代码会在 #ifdef 后面的符号被定义的情况下被编译。至于符号的解析结果是什么(如果有的话),并不重要。
在 Visual Objects 中,代码在 #ifdef ... #endif(或 #else)代码块中的代码只有在 #ifdef 后面的符号已定义,且解析为逻辑 TRUE 值的表达式时才会被编译。在下面的示例中,代码将打印 "in #else":
DEFINE foo := FALSE
#ifdef foo
? "in #ifdef
#else
? "in #else" // <- 此代码在 Visual Objects 中编译
#endif
而 X# 中的相应代码会打印 "in #ifdef":
DEFINE foo := FALSE
#ifdef foo
? "in #ifdef // <- 此代码在 Vulcan.NET 中编译
#else
? "in #else"
#endif
使用 -vo8 时,X# 预处理器会检查预处理器符号的值,以确定该符号是否解析为逻辑 TRUE 或 FALSE 值。 但是,X# 预处理器不会评估预处理器表达式,而 Visual Objects 则会。即使启用了 -vo8,预处理器符号也必须解析为包含 TRUE 或 FALSE(不区分大小写)或数值的单一表达式。
数值 0 解析为 FALSE,所有非零数值解析为 TRUE。解析为表达式的预处理器符号不进行评估,实际上解析为 FALSE。
要在 Visual Studio 开发环境中设置该编译器选项,请执行以下操作
1.打开项目的 "属性"页面
2.点击 Dialect 选项卡
3.更改值
4.查看属性页
// 对于 #ifdef...
// 解析为 FALSE:
#define foo FALSE
#define foo 0
// 解析为 TRUE:
#define foo True
#define foo 1
#define foo -567
// 不会被处理,并有效地解析为 FALSE
// 因此与 Visual Objects 不兼容:
#define foo TRUE .AND. TRUE
#define foo TRUE .OR. TRUE
#define foo 1 * 2
提示
在调试预处理器生成的输出时,-ppo 选项非常有用。