Previous: , Up: Directing Compilation [Contents][Index]


30.2 Static Assertions

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.

Note: The == used instead of >= probably makes the program wrong but not invalid.

union y
{
 int i;
 int *ptr;
 _Static_assert (sizeof (int *) == sizeof (int),
		 "Pointer and int not same size");
};

Previous: Pragmas, Up: Directing Compilation [Contents][Index]

AltStyle によって変換されたページ (->オリジナル) /