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:
committed by
Carlos R. Mafra
parent
c3a132215d
commit
fd47650717
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user