Debug.h: Implement a real STATIC_ASSERT on non-GCC2.

This commit is contained in:
Augustin Cavalier 2018-08-22 00:32:30 -04:00
parent e0d28cdccf
commit 47b079afc9
2 changed files with 26 additions and 14 deletions

View File

@ -90,12 +90,18 @@ extern "C" {
/* STATIC_ASSERT is a compile-time check that can be used to */ /* STATIC_ASSERT is a compile-time check that can be used to */
/* verify static expressions such as: STATIC_ASSERT(sizeof(int64) == 8); */ /* verify static expressions such as: STATIC_ASSERT(sizeof(int64) == 8); */
#define STATIC_ASSERT(x) \ #if __GNUC__ >= 5 && !defined(__cplusplus)
do { \ # define STATIC_ASSERT(x) _Static_assert(x, "static assert failed!")
struct __staticAssertStruct__ { \ #elif defined(__cplusplus) && __cplusplus >= 201103L
char __static_assert_failed__[2*(x) - 1]; \ # define STATIC_ASSERT(x) static_assert(x, "static assert failed!")
}; \ #else
} while (false) # define STATIC_ASSERT(x) \
do { \
struct __staticAssertStruct__ { \
char __static_assert_failed__[2*(x) - 1]; \
}; \
} while (false)
#endif
#endif /* _DEBUG_H */ #endif /* _DEBUG_H */

View File

@ -69,12 +69,18 @@
# define ASSERT_PRINT(x, format, args...) do { } while(0) # define ASSERT_PRINT(x, format, args...) do { } while(0)
#endif #endif
#define STATIC_ASSERT(x) \ #if __GNUC__ >= 5 && !defined(__cplusplus)
do { \ # define STATIC_ASSERT(x) _Static_assert(x, "static assert failed!")
struct __staticAssertStruct__ { \ #elif defined(__cplusplus) && __cplusplus >= 201103L
char __static_assert_failed__[2*(x) - 1]; \ # define STATIC_ASSERT(x) static_assert(x, "static assert failed!")
}; \ #else
} while (false) # define STATIC_ASSERT(x) \
do { \
struct __staticAssertStruct__ { \
char __static_assert_failed__[2*(x) - 1]; \
}; \
} while (false)
#endif
#if KDEBUG #if KDEBUG
# define KDEBUG_ONLY(x) x # define KDEBUG_ONLY(x) x