| /* CC0 (Public domain) - see LICENSE file for details */ |
| #ifndef CCAN_BUILD_ASSERT_H |
| #define CCAN_BUILD_ASSERT_H |
| |
| /** |
| * BUILD_ASSERT - assert a build-time dependency. |
| * @cond: the compile-time condition which must be true. |
| * |
| * Your compile will fail if the condition isn't true, or can't be evaluated |
| * by the compiler. This can only be used within a function. |
| * |
| * Example: |
| * #include <stddef.h> |
| * ... |
| * static char *foo_to_char(struct foo *foo) |
| * { |
| * // This code needs string to be at start of foo. |
| * BUILD_ASSERT(offsetof(struct foo, string) == 0); |
| * return (char *)foo; |
| * } |
| */ |
| #define BUILD_ASSERT(cond) \ |
| do { (void) sizeof(char [1 - 2*!(cond)]); } while(0) |
| |
| /** |
| * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression. |
| * @cond: the compile-time condition which must be true. |
| * |
| * Your compile will fail if the condition isn't true, or can't be evaluated |
| * by the compiler. This can be used in an expression: its value is "0". |
| * |
| * Example: |
| * #define foo_to_char(foo) \ |
| * ((char *)(foo) \ |
| * + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0)) |
| */ |
| #define BUILD_ASSERT_OR_ZERO(cond) \ |
| (sizeof(char [1 - 2*!(cond)]) - 1) |
| |
| #endif /* CCAN_BUILD_ASSERT_H */ |