Will Newton <[email protected]> writes: >>> -#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED >>> +#if defined _LIBC_REENTRANT || defined HAVE_DECL_FGETS_UNLOCKED >> >> This is no-no. On some platforms (e.g. Mac OS X), >> HAVE_DECL_FGETS_UNLOCKED will be defined as 0: >> >> $ grep 'define HAVE_DECL_FGETS' gettext-runtime/config.h >> #define HAVE_DECL_FGETS_UNLOCKED 0 >> >> What's the rationale behind this change? According to C99 and C11, the >> C preprocessor shall convert undefined identifiers to pp-number 0 before >> evaluation. > > glibc quite recently switched to passing -Wundef to the compiler which > requires that #if is only used on defined values in order to catch > bugs where somebody forgets or typos the name of a define.
Ah, I just remembered the related discussion on bug-gnulib. > The usual way of testing config variables that start with HAVE_ is to > use #ifdef as they are binary on/off switches. Is there a reason this > constant must distinguish between not-defined and zero? It is an expansion of a standard autoconf macro AC_CHECK_DECLS and is a documented behavior: http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Generic-Declarations.html#index-AC_005fCHECK_005fDECLS-680 Perhaps we could special case this in intl/, but it would be non-trivial and I doubt that it is worth doing just in order to suppress the compiler warnings. So, IMO, > Converting it to: > > #if defined _LIBC_REENTRANT || (defined HAVE_DECL_FGETS_UNLOCKED && > HAVE_DECL_FGETS_UNLOCKED) > > should work but it is a bit ugly. This is the easier way to work around it (and it seems argp/ already does that). Regards, -- Daiki Ueno
