0d6ae8ee3ad21de21313fde2dc18fdb78da3dcd5
[ccan] / ccan / build_assert / build_assert.h
1 /* Licensed under LGPLv2.1+ - see LICENSE file for details */
2 #ifndef CCAN_BUILD_ASSERT_H
3 #define CCAN_BUILD_ASSERT_H
4
5 /**
6  * BUILD_ASSERT - assert a build-time dependency.
7  * @cond: the compile-time condition which must be true.
8  *
9  * Your compile will fail if the condition isn't true, or can't be evaluated
10  * by the compiler.  This can only be used within a function.
11  *
12  * Example:
13  *      #include <stddef.h>
14  *      ...
15  *      static char *foo_to_char(struct foo *foo)
16  *      {
17  *              // This code needs string to be at start of foo.
18  *              BUILD_ASSERT(offsetof(struct foo, string) == 0);
19  *              return (char *)foo;
20  *      }
21  */
22 #define BUILD_ASSERT(cond) \
23         do { (void) sizeof(char [1 - 2*!(cond)]); } while(0)
24
25 /**
26  * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression.
27  * @cond: the compile-time condition which must be true.
28  *
29  * Your compile will fail if the condition isn't true, or can't be evaluated
30  * by the compiler.  This can be used in an expression: its value is "0".
31  *
32  * Example:
33  *      #define foo_to_char(foo)                                        \
34  *               ((char *)(foo)                                         \
35  *                + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))
36  */
37 #define BUILD_ASSERT_OR_ZERO(cond) \
38         (sizeof(char [1 - 2*!(cond)]) - 1)
39
40 #endif /* CCAN_BUILD_ASSERT_H */