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.

Example 253-Case statements that fail for EBC
#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.

Example 254-Case statements that work for EBC
#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) {
}