X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/b5130310e64d10370f0ed36f20ce24ad3c84dc16..e674612eb9e1a1dde2522260163a93a13ed44a0f:/lib/sod.h diff --git a/lib/sod.h b/lib/sod.h index dc85843..360afa8 100644 --- a/lib/sod.h +++ b/lib/sod.h @@ -34,6 +34,49 @@ /*----- Preliminary utilities ---------------------------------------------*/ +/* --- @SOD__HAVE_VARARGS_MACROS@ --- * + * + * Use: Defined if the compiler supports C99-style variadic macros. + * + * This is more complicated than just checking the value of + * @__STDC_VERSION__@ because GCC has traditionally claimed C89 + * by default, but provides the functionality anyway unless it's + * been explicitly turned off. + */ + +#if __STDC_VERSION__ >= 199901 + /* The feature exists. All is well with the world. */ + +# define SOD__HAVE_VARARGS_MACROS + +#elif __GNUC__ >= 3 + /* We're using GCC, which is trying to deny it but we don't believe it. + * Unfortunately there's a fly in the ointment: if `-pedantic' -- or, + * worse, `-pedantic-errors' -- is set, then GCC will warn about these + * macros being defined, and there isn't a way to detect pedantry from the + * preprocessor. + * + * We must deploy bodges. There doesn't seem to be a good way to suppress + * particular warnings from the preprocessor: in particular, messing about + * with `pragma GCC diagnostic' doesn't help. So we're left with this + * hack: just declare all Sod-generated header files which try to do + * varargs macro things to be `system headers', which means that GCC's + * preprocessor will let them get away with all manner of nefarious stuff. + */ + +# define SOD__HAVE_VARARGS_MACROS +# define SOD__VARARGS_MACROS_PREAMBLE _Pragma("GCC system_header") + +#endif + +/* Make sure this gratuitous hack is understood, at least vacuously. */ +#ifndef SOD__VARARGS_MACROS_PREAMBLE +# define SOD__VARARGS_MACROS_PREAMBLE +#endif + +/* We're going to want to make use of this ourselves. */ +SOD__VARARGS_MACROS_PREAMBLE + /* --- @SOD__CAR@ --- * * * Arguments: @...@ = a nonempty list of arguments @@ -41,7 +84,7 @@ * Returns: The first argument only. */ -#if __STDC_VERSION__ >= 199901 +#ifdef SOD__HAVE_VARARGS_MACROS # define SOD__CAR(...) SOD__CARx(__VA_LIST__, _) # define SOD__CARx(a, ...) a #endif