The -vo4 option directs the compiler to implicitly convert numeric types from larger types to smaller types, as well as from fractional types to integral types.
-vo4[+|-]
+ | - | Specifying +, or just -vo4, directs the compiler to implicitly convert signed integer values to/from unsigned values, and larger integer types to smaller integer types. This provides compatibility with Visual Objects, which permits such conversions without an explicit cast or conversion operator. |
For safety reasons, this option is disabled by default. Implicitly converting between signed and unsigned integer types or between larger to smaller integer types can cause numeric overflow errors at runtime or unintended values to be passed depending on whether overflow checking is enabled or disabled. By default, you must explicitly cast a signed integer to its unsigned counterpart, as well as cast larger integer types to smaller ones. By explicitly doing so, it is assumed that the programmer is aware the conversion is safe.
When this option is enabled, the compiler will implicitly convert the data types listed in the table below:
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 |
For each conversion, the compiler will raise an appropriate warning. You may disable the warning with the -wx switch, or insert an explicit cast in the source code to eliminate the warning.
It is strongly recommended that you do not use this compiler option in new code. All of the conversions listed in the table above have the ability to lose data or return incorrect values, since the range of values in the source data type cannot be represented in the target data type.
For example, an INT containing a negative number cannot be represented in a DWORD. Similarly, an INT greater than 65535 cannot be represented in a SHORT. If you must mix signed and unsigned types or pass a larger type to a smaller type, you should always supply an explicit cast rather than using -vo4. This will document the fact that the conversion is known to be safe, and it will not suppress compile time errors if incompatible integer types are unintentionally used.
1.Open the project's Properties page.
2.Click the Dialect tab.
3.Change the value.
4.Click here to see the property page.
FUNCTION Start() AS VOID
LOCAL dw := 4294967296 AS DWORD
LOCAL i := -1 AS INT
DWORD_Function( i ) // no error if compiled with /vo4
INT_Function( dw ) // no error if compiled with /vo4
RETURN
FUNCTION DWORD_Function( x AS DWORD ) AS VOID
? x
RETURN
FUNCTION INT_Function( x AS INT ) AS VOID
? x
RETURN