Previous: Pragmas, Up: Directing Compilation [Contents][Index]
You can add compiler-time tests for necessary conditions into your
code using _Static_assert. This can be useful, for example, to
check that the compilation target platform supports the type sizes
that the code expects. For example,
_Static_assert ((sizeof (long int) >= 8),
"long int needs to be at least 8 bytes");
reports a compile-time error if compiled on a system with long integers smaller than 8 bytes, with ‘long int needs to be at least 8 bytes’ as the error message.
Since calls _Static_assert are processed at compile time, the
expression must be computable at compile time and the error message
must be a literal string. The expression can refer to the sizes of
variables, but can’t refer to their values. For example, the
following static assertion is invalid for two reasons:
char *error_message = "long int needs to be at least 8 bytes"; int size_of_long_int = sizeof (long int); _Static_assert (size_of_long_int == 8, error_message);
The expression size_of_long_int == 8 isn’t computable at
compile time, and the error message isn’t a literal string.
You can, though, use preprocessor definition values with
_Static_assert:
#define LONG_INT_ERROR_MESSAGE "long int needs to be \ at least 8 bytes" _Static_assert ((sizeof (long int) == 8), LONG_INT_ERROR_MESSAGE);
Static assertions are permitted wherever a statement or declaration is permitted, including at top level in the file, and also inside the definition of a type.
union y
{
int i;
int *ptr;
_Static_assert (sizeof (int *) == sizeof (int),
"Pointer and int not same size");
};