Coding: Add comment disproving control-flow changing macros
[Samba/gebeck_regimport.git] / lib / ccan / build_assert / build_assert.h
blob24e59c44cd930173178ac9b6e101b0af64a879e9
1 #ifndef CCAN_BUILD_ASSERT_H
2 #define CCAN_BUILD_ASSERT_H
4 /**
5 * BUILD_ASSERT - assert a build-time dependency.
6 * @cond: the compile-time condition which must be true.
8 * Your compile will fail if the condition isn't true, or can't be evaluated
9 * by the compiler. This can only be used within a function.
11 * Example:
12 * #include <stddef.h>
13 * ...
14 * static char *foo_to_char(struct foo *foo)
15 * {
16 * // This code needs string to be at start of foo.
17 * BUILD_ASSERT(offsetof(struct foo, string) == 0);
18 * return (char *)foo;
19 * }
21 #define BUILD_ASSERT(cond) \
22 do { (void) sizeof(char [1 - 2*!(cond)]); } while(0)
24 /**
25 * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression.
26 * @cond: the compile-time condition which must be true.
28 * Your compile will fail if the condition isn't true, or can't be evaluated
29 * by the compiler. This can be used in an expression: its value is "0".
31 * Example:
32 * #define foo_to_char(foo) \
33 * ((char *)(foo) \
34 * + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))
36 #define BUILD_ASSERT_OR_ZERO(cond) \
37 (sizeof(char [1 - 2*!(cond)]) - 1)
39 #endif /* CCAN_BUILD_ASSERT_H */