Files
shadow/lib/must_be.h
T
Alejandro Colomar 10f31a97e2 must_be.h: Add must_be() macro
It's like static_assert(3), but can be used in more places.  It's
necessary for writing a must_be_array() macro.

Link: <https://stackoverflow.com/a/57537491>
Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2023-09-01 09:39:23 +02:00

62 lines
1.6 KiB
C

/*
* SPDX-FileCopyrightText: 2019-2023, Alejandro Colomar <alx@kernel.org>
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SHADOW_INCLUDE_LIBMISC_MUST_BE_H_
#define SHADOW_INCLUDE_LIBMISC_MUST_BE_H_
#include <config.h>
#include <assert.h>
/*
* SYNOPSIS
* int must_be(bool e);
*
* ARGUMENTS
* e Expression to be asserted.
*
* DESCRIPTION
* This macro fails compilation if 'e' is false. If 'e' is true,
* it returns (int) 0, so it doesn't affect the expression in which
* it is contained.
*
* This macro is similar to static_assert(3). While
* static_assert(3) can only be used where a statement is allowed,
* this must_be() macro can be used wherever an expression is
* allowed.
*
* RETURN VALUE
* 0
*
* ERRORS
* If 'e' is false, the compilation will fail, as when using
* static_assert(3).
*
* EXAMPLES
* #define must_be_array(a) must_be(is_array(a))
*
* #define NITEMS(a) (sizeof(a) / sizeof(*(a)) + must_be_array(a))
*
* int foo[42];
* int bar[NITEMS(foo)];
*/
#define must_be(e) \
( \
0 * (int) sizeof( \
struct { \
static_assert(e, ""); \
int ISO_C_forbids_a_struct_with_no_members_; \
} \
) \
)
#endif // include guard