An integer compile-time constant is a value
that is determined during compilation and cannot be changed at run
time. An integer compile-time constant expression is
an expression that is composed of constants and evaluated to a constant.
An integer constant expression is an expression that is composed
of only the following:
literals
enumerators
const variables
static data members of integral or enumeration types
casts to integral types
sizeof expressions, where the operand is not a variable
length array
The sizeof operator applied to a variable length array
type is evaluated at run time, and therefore is not a constant expression.
You must use an integer constant expression in the following situations:
In the subscript declarator as the description of an array bound.
After the keyword case in a switch statement.
In an enumerator, as the numeric value of an enumeration constant.
In a bit-field width specifier.
In the preprocessor #if statement. (Enumeration
constants, address constants, and sizeof cannot be specified
in a preprocessor #if statement.)