mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
spa: support single argument static assertions in older standards
Single argument static_assert() is only available since C++17 and C23. Some compilers accept it even in earlier language versions, but some do not. Single argument static assertions can be supported by using a GCC extensions, namely that `, ## __VA_ARGS__` removes the comma if the variadic argument list is empty. This enables a construction which passes a pre-determined string as the second argument of the underlying static_assert() when only a single argument is used in the `SPA_STATIC_ASSERT()` macro. Fixes #3050
This commit is contained in:
parent
57a89e5723
commit
39ce32985b
1 changed files with 8 additions and 5 deletions
|
|
@ -8,18 +8,21 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
# if __cplusplus >= 201103L
|
# if __cplusplus >= 201103L
|
||||||
# define SPA_STATIC_ASSERT static_assert
|
# define SPA_STATIC_ASSERT_IMPL(expr, msg, ...) static_assert(expr, msg)
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# include <stdbool.h>
|
# include <stdbool.h>
|
||||||
# if __STDC_VERSION__ >= 201112L
|
# if __STDC_VERSION__ >= 201112L
|
||||||
# define SPA_STATIC_ASSERT _Static_assert
|
# define SPA_STATIC_ASSERT_IMPL(expr, msg, ...) _Static_assert(expr, msg)
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef SPA_STATIC_ASSERT
|
#ifndef SPA_STATIC_ASSERT_IMPL
|
||||||
#define SPA_STATIC_ASSERT(a, b) \
|
#define SPA_STATIC_ASSERT_IMPL(expr, ...) \
|
||||||
((void)sizeof(struct { int spa_static_assertion_failed : 2 * !!(a) - 1; }))
|
((void)sizeof(struct { int spa_static_assertion_failed : 2 * !!(expr) - 1; }))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define SPA_STATIC_ASSERT(expr, ...) SPA_STATIC_ASSERT_IMPL(expr, ## __VA_ARGS__, "`" #expr "` evaluated to false")
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue