-vo4选项指示编译器将数字类型从较大类型隐式转换为较小类型,同时也从分数类型转换为整数类型。
-vo4[+|-]
+ | - | 指定+,或只是-vo4,指示编译器将有符号整数值隐式转换为/从无符号值,并将较大的整数类型转换为较小的整数类型。这提供了与Visual Objects的兼容性,允许进行这种转换而无需显式转换或转换运算符。 |
出于安全考虑,该选项默认为关闭。有符号和无符号整数类型之间或较大整数类型到较小整数类型之间的隐式转换可能会在运行时导致数值溢出错误,或传递非预期值,这取决于溢出检查是启用还是禁用。默认情况下,必须明确地将有符号整数转换为无符号整数,并将较大的整数类型转换为较小的整数类型。
启用该选项后,编译器将隐式转换下表中列出的数据类型:
From |
To |
SByte |
BYTE, WORD, Char, DWORD |
SHORT |
BYTE, SByte, WORD, Char, DWORD |
INT |
BYTE, SByte, WORD, SHORT, Char, DWORD |
INT64 |
BYTE, SByte, WORD, SHORT, Char, INT, DWORD, UINT64 |
BYTE |
SByte |
WORD |
SByte, BYTE, SHORT, Char, INT |
DWORD |
SByte, BYTE, WORD, SHORT, INT |
UINT64 |
SByte, BYTE, WORD, SHORT, Char, INT, DWORD, INT64 |
REAL8, REAL4, DECIMAL |
All other numeric types |
FLOAT, CURRENCY |
All other numeric types |
每次转换时,编译器都会发出相应的警告。您可以使用 -wx 开关禁用该警告,或在源代码中插入一个显式转换来消除该警告。
强烈建议不要在新代码中使用该编译器选项。由于源数据类型中的值范围无法在目标数据类型中表示,因此上表中列出的所有转换都可能丢失数据或返回不正确的值。
例如,包含负数的 INT 不能用 DWORD 表示。同样,大于 65535 的 INT 也不能用 SHORT 表示。如果必须混合使用有符号和无符号类型,或将较大的类型传递给较小的类型,则应始终提供明确的转换而不是使用 -vo4。这将记录转换是安全的,但如果无意中使用了不兼容的整数类型,则不会消除编译时的错误。
要在 Visual Studio 开发环境中设置该编译器选项,请执行以下操作
1.打开项目的 "属性"页面
2.点击 Dialect 选项卡
3.更改值
4.查看属性页
FUNCTION Start() AS VOID
LOCAL dw := 4294967296 AS DWORD
LOCAL i := -1 AS INT
DWORD_Function( i ) // 如果编译器使用 /vo4 则没有错误
INT_Function( dw ) // 如果编译器使用 /vo4 则没有错误
RETURN
FUNCTION DWORD_Function( x AS DWORD ) AS VOID
? x
RETURN
FUNCTION INT_Function( x AS INT ) AS VOID
? x
RETURN