The required argument consists of whatever follows immediately within the same command-line token, else is the whole of the next command-line token.

Failure to provide an argument is an error (D2004). There is no formal constraint on the length of the argument.

The argument is parsed into a name and value. The name extends up to but not including the first # or = sign. Should anything remain in the argument, then in general, it becomes the value. For ease of reference, support for the # sign as the separator is henceforth taken as understood. Indeed, the first # sign in the argument actually is replaced by an = sign as far as concerns all subsequent interpretation of the argument by CL or communication to any compiler module. The coding has a side-effect, possibly by oversight: if the separator (as given) between name and value is an = sign, then the first # sign in value (as interpreted) is changed to an = sign.


A /U that provides only a name (i.e., with no = sign or value) overrides earlier /D options that have the same name (with or without an = sign or value). A /U with any other syntax overrides earlier /D options that have exactly the same argument. Either way, unless the /D is an initial option or is weakly implied or the /noover option is active, the override causes a warning (D4025).

This option is handled entirely within CL. It generates nothing that passes to any compiler module.


The sole action of the /U option is to override earlier, matching /D options, as described above.

Documentation Status

The product documentation describes only the syntax that provides only a name. If /U ever is useful in practice, then surely it is especially useful to know that it can be given with both a name and value so that it overrides a preceding /D that sets the same name and value while leaving alone any /D that sets any other value for that same name.