aboutsummaryrefslogtreecommitdiffstats
path: root/examples/common
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2022-04-22 11:24:39 -0700
committerChris Robinson <[email protected]>2022-04-22 11:24:39 -0700
commite7a2c0af762e19c336447e2034ee7ed81f111009 (patch)
tree559fefdaf0b59743c8cab19d0cdd0f355247c3b2 /examples/common
parent1050428d3d463616c622d3f95effa313bf334249 (diff)
Define FUNCTION_CAST in a common header
Diffstat (limited to 'examples/common')
-rw-r--r--examples/common/alhelpers.h13
1 files changed, 13 insertions, 0 deletions
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<T>(ptr)
+#else
+#define FUNCTION_CAST(T, ptr) (T)(ptr)
+#endif
+
#ifdef __cplusplus
} // extern "C"
#endif