X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/18c831dcd0ae4d660c70ccac69d27ed2a97851be..08bb7015a9e28c5c9d38fe05a6f6644bc21fa527:/utils/align.h diff --git a/utils/align.h b/utils/align.h index 196c8a2..9d2e654 100644 --- a/utils/align.h +++ b/utils/align.h @@ -32,22 +32,36 @@ extern "C" { #endif +/*----- Header files ------------------------------------------------------*/ + +#include + /*----- Data structures ---------------------------------------------------*/ union align { int i; long l; double d; + long double ld; void *p; void (*f)(void *); struct notexist *s; +#if __STDC_VERSION__ >= 201112 + max_align_t m; +#endif }; /*----- Macros provided ---------------------------------------------------*/ +#if __STDC_VERSION__ >= 201112 +# define ALIGNOF(ty) _Alignof(ty) +#else +# define ALIGNOF(ty) (offsetof(struct { unsigned char _x; ty _y; }, _y)) +#endif + #define ALIGN(sz) do { \ - sz += sizeof(union align) - 1; \ - sz -= sz % sizeof(union align); \ + (sz) += ALIGNOF(union align) - 1; \ + (sz) -= (sz)%ALIGNOF(union align); \ } while (0) /*----- That's all, folks -------------------------------------------------*/