1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-22 05:48:01 +01:00

WUtil: New macro 'wlengthof' in the public API to get number of elements in an array

The new macro 'wlengthof' returns the number of elements for which a local
array have been defined, which makes code easier to read than the
previous [sizeof() / sizeof([0]) ] construct.

The macro includes a static assertion to stop compilation if it is being
used on a pointer, for which we cannot know the size of the array, to
avoid generating dummy result. This can work only with C11 which
standardised the static assertions.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
This commit is contained in:
Christophe CURIS
2013-11-08 21:18:19 +01:00
committed by Carlos R. Mafra
parent c3a132215d
commit fd47650717
2 changed files with 32 additions and 1 deletions

View File

@@ -88,6 +88,27 @@
#endif /* !NDEBUG */
#ifdef static_assert
# define _wutil_static_assert(check, message) static_assert(check, message)
#else
# ifdef __STDC_VERSION__
# if __STDC_VERSION__ >= 201112L
/*
* Ideally, we would like to include <assert.h> to have 'static_assert'
* properly defined, but as we have to be sure about portability and
* because we're a public header we can't count on 'configure' to tell
* us about availability, so we use the raw C11 keyword
*/
# define _wutil_static_assert(check, message) _Static_assert(check, message)
# else
# define _wutil_static_assert(check, message) /**/
# endif
# else
# define _wutil_static_assert(check, message) /**/
# endif
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@@ -182,6 +203,16 @@ typedef void WMNotificationObserverAction(void *observerData,
WMNotification *notification);
/* ---[ Macros ]---------------------------------------------------------- */
#define wlengthof(array) \
({ \
_wutil_static_assert(sizeof(array) > sizeof(array[0]), \
"the macro 'wlengthof' cannot be used on pointers, only on known size arrays"); \
sizeof(array) / sizeof(array[0]); \
})
/* ---[ WINGs/memory.c ]-------------------------------------------------- */
void* wmalloc(size_t size);

View File

@@ -54,7 +54,7 @@ WINGS_VERSION=$WINGS_CURRENT:$WINGS_REVISION:$WINGS_AGE
AC_SUBST(WINGS_VERSION)
dnl
dnl libWUtil
WUTIL_CURRENT=3
WUTIL_CURRENT=4
WUTIL_REVISION=0
WUTIL_AGE=0
WUTIL_VERSION=$WUTIL_CURRENT:$WUTIL_REVISION:$WUTIL_AGE