From e7a2c0af762e19c336447e2034ee7ed81f111009 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 22 Apr 2022 11:24:39 -0700 Subject: Define FUNCTION_CAST in a common header --- examples/common/alhelpers.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'examples/common') diff --git a/examples/common/alhelpers.h b/examples/common/alhelpers.h index 3752d218..34f73864 100644 --- a/examples/common/alhelpers.h +++ b/examples/common/alhelpers.h @@ -18,6 +18,19 @@ void CloseAL(void); int altime_get(void); void al_nssleep(unsigned long nsec); +/* C doesn't allow casting between function and non-function pointer types, so + * with C99 we need to use a union to reinterpret the pointer type. Pre-C99 + * still needs to use a normal cast and live with the warning (C++ is fine with + * a regular reinterpret_cast). + */ +#if __STDC_VERSION__ >= 199901L +#define FUNCTION_CAST(T, ptr) (union{void *p; T f;}){ptr}.f +#elif defined(__cplusplus) +#define FUNCTION_CAST(T, ptr) reinterpret_cast(ptr) +#else +#define FUNCTION_CAST(T, ptr) (T)(ptr) +#endif + #ifdef __cplusplus } // extern "C" #endif -- cgit v1.2.3