29.4.2 CASE Statements
Because pointers and the data types
INTN
and UINTN
are different sizes on different instruction set architectures and case statements are determined at compile time; the sizeof()
function cannot be used in a case
statement with an indeterminately sized data type because the sizeof()
function cannot be evaluated to a constant by the EBC compiler at compile time. UEFI status codes values such as EFI_SUCCESS
and EFI_UNSUPPORTED
are defined differently on different CPU architectures. As a result, UEFI status codes cannot be used in case
expressions. The following example shows examples using case
statements.#include <Uefi.h>
UINTN Value;
switch (Value) {
case 0: // Works because 0 is a constant.
break;
case sizeof (UINT16): // Works because sizeof (UINT16) is always 2
break;
case sizeof (UINTN): // EBC compiler error. sizeof (UINTN) is not constant.
break;
case EFI_UNSUPPORTED: // EBC compiler error. EFI_UNSUPPORTED is not constant.
break;
}
One solution to this issue is to convert
case
statements into if
/else
statements. The example below shows the equivalent functionality as Example 253, above, but does not generate any EBC compiler errors.#include <Uefi.h>
UINTN Value;
switch (Value) {
case 0: // Works because 0 is a constant.
break;
case sizeof (UINT16): // Works because sizeof (UINT16) is always 2
break;
}
if (Value == sizeof (UINTN)) {
} else if (Value == EFI_UNSUPPORTED) {
}