1static_assert(3)           Library Functions Manual           static_assert(3)
2
3
4

NAME

6       static_assert, _Static_assert - fail compilation if assertion is false
7

LIBRARY

9       Standard C library (libc)
10

SYNOPSIS

12       #include <assert.h>
13
14       void static_assert(scalar constant-expression, const char *msg);
15
16       /* Since C23: */
17       void static_assert(scalar constant-expression);
18

DESCRIPTION

20       This  macro is similar to assert(3), but it works at compile time, gen‐
21       erating a compilation error (with an optional message) when  the  input
22       is false (i.e., compares equal to zero).
23
24       If the input is nonzero, no code is emitted.
25
26       msg must be a string literal.  Since C23, this argument is optional.
27
28       There's  a keyword, _Static_assert(), that behaves identically, and can
29       be used without including <assert.h>.
30

RETURN VALUE

32       No value is returned.
33

VERSIONS

35       In C11, the second argument (msg) was mandatory; since C23, it  can  be
36       omitted.
37

STANDARDS

39       C11 and later.
40

EXAMPLES

42       static_assert()  can't  be  used  in  some  places, like for example at
43       global scope.  For that, a macro must_be() can be written in  terms  of
44       static_assert().   The following program uses the macro to get the size
45       of an array safely.
46
47           #include <assert.h>
48           #include <stddef.h>
49           #include <stdint.h>
50           #include <stdio.h>
51           #include <stdlib.h>
52           #include <string.h>
53
54           /*
55            * This macro behaves like static_assert(), failing to
56            * compile if its argument is not true.  However, it always
57            * returns 0, which allows using it everywhere an expression
58            * can be used.
59            */
60           #define must_be(e)                                        \
61           (                                                         \
62               0 * (int) sizeof(                                     \
63                   struct {                                          \
64                       static_assert(e);                             \
65                       int  ISO_C_forbids_a_struct_with_no_members;  \
66                   }                                                 \
67               )                                                     \
68           )
69
70           #define is_same_type(a, b)  \
71               __builtin_types_compatible_p(typeof(a), typeof(b))
72
73           #define is_array(arr)       (!is_same_type((arr), &*(arr)))
74           #define must_be_array(arr)  must_be(is_array(arr))
75
76           #define sizeof_array(arr)   (sizeof(arr) + must_be_array(arr))
77           #define nitems(arr)         (sizeof((arr)) / sizeof((arr)[0]) \
78                                        + must_be_array(arr))
79
80           int     foo[10];
81           int8_t  bar[sizeof_array(foo)];
82
83           int
84           main(void)
85           {
86               for (size_t i = 0; i < nitems(foo); i++) {
87                   foo[i] = i;
88               }
89
90               memcpy(bar, foo, sizeof_array(bar));
91
92               for (size_t i = 0; i < nitems(bar); i++) {
93                   printf("%d,", bar[i]);
94               }
95
96               exit(EXIT_SUCCESS);
97           }
98

SEE ALSO

100       assert(3)
101
102
103
104Linux man-pages 6.05              2023-05-03                  static_assert(3)
Impressum