diff options
author | Chris Robinson <[email protected]> | 2022-04-22 11:24:39 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2022-04-22 11:24:39 -0700 |
commit | e7a2c0af762e19c336447e2034ee7ed81f111009 (patch) | |
tree | 559fefdaf0b59743c8cab19d0cdd0f355247c3b2 /examples/common | |
parent | 1050428d3d463616c622d3f95effa313bf334249 (diff) |
Define FUNCTION_CAST in a common header
Diffstat (limited to 'examples/common')
-rw-r--r-- | examples/common/alhelpers.h | 13 |
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 |