对于声明为零参数且没有显式调用约定的函数,-vo5 选项指示编译器隐式使用 CLIPPER 调用约定。
-vo5[+|-]
+ | - | 指定 + 或只指定 -vo5,可指示编译器隐式使用 CLIPPER 调用约定,用于声明参数为零且没有显式调用约定的函数、方法和构造函数。 |
为了与 Clipper 兼容,Visual Objects 对所有声明为零参数且没有显式调用约定的函数和方法使用 CLIPPER 调用约定。可以使用 STRICT 关键字来覆盖默认设置,并使函数使用 STRICT 调用约定。
然而,在绝大多数情况下,从不向声明为零参数的函数和方法传递参数,因此默认使用 CLIPPER 调用约定不仅在函数本身产生不必要的开销,而且在每个调用点都会有开销。此外,CLIPPER 调用约定允许传递任意数量和类型的参数,从而阻止了编译时的错误检查。
在 X# 中,默认情况下,声明为零参数的函数和方法将使用 STRICT 调用约定进行编译,除非显式指定了 CLIPPER 关键字。这种行为与 Visual Objects 完全相反,但会产生更高效的代码以及编译时的错误检查。向声明为接受零参数的函数传递任何参数将引发编译时错误。
然而,这可能会导致在最初使用 Visual Objects 编写的代码中出现兼容性问题。-vo5 编译器选项会反转 X# 关于零参数函数默认行为,使其与 Visual Objects 相同。
无论启用与否,始终可以使用 CLIPPER 和 STRICT 关键字来明确指定所需的调用约定。
要在 Visual Studio 开发环境中设置该编译器选项,请执行以下操作
1.打开项目的 "属性"页面
2.点击 Dialect 选项卡
3.更改值
4.查看属性页
FUNCTION foo() // CLIPPER
? pcount(), _getFParam( 1 )
RETURN
FUNCTION Start() AS VOID
foo( 1 )
RETURN
如果使用了 -vo5,或者在 FUNCTION foo() 声明的末尾添加了 CLIPPER 关键字,上述示例就能正确编译和运行。否则,在调用 foo() 以及调用 pcount() 和 _getFParam()(这在 STRICT 调用约定函数中是非法的)时将产生编译器错误。