Problems with default _POSIX_C_SOURCE in features.h ??

Chris Hall glibc@gmch.uk
Tue Mar 26 20:28:00 GMT 2019


features.h (in glibc 2.29, 31-Jan-2019) includes:
______________________________________________________________________
/* If none of the ANSI/POSIX macros are defined, or if _DEFAULT_SOURCE
    is defined, use POSIX.1-2008 (or another version depending on
    _XOPEN_SOURCE).  */
#ifdef _DEFAULT_SOURCE
# if !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE
#  define __USE_POSIX_IMPLICITLY	1
# endif
# undef  _POSIX_SOURCE
# define _POSIX_SOURCE	1
# undef  _POSIX_C_SOURCE
# define _POSIX_C_SOURCE	200809L
#endif

#if ((!defined __STRICT_ANSI__					\
       || (defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 500))	\
      && !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE)
# define _POSIX_SOURCE	1
# if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 500
#  define _POSIX_C_SOURCE	2
# elif defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 600
#  define _POSIX_C_SOURCE	199506L
# elif defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 700
#  define _POSIX_C_SOURCE	200112L
# else
#  define _POSIX_C_SOURCE	200809L
# endif
# define __USE_POSIX_IMPLICITLY	1
#endif
______________________________________________________________________

But this does not do what the comment says it does :-(

If _DEFAULT_SOURCE is defined, but neither POSIX_SOURCE nor
_POSIX_C_SOURCE are defined, this sets _POSIX_C_SOURCE	200809L,
no matter what _XOPEN_SOURCE is.

Bug #1 ??


Further on in features.h we have:
_______________________________________________________________________
#if defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 2 || \
                                                  defined _XOPEN_SOURCE
# define __USE_POSIX2   1
#endif

#if defined _POSIX_C_SOURCE && (_POSIX_C_SOURCE - 0) >= 199309L
# define __USE_POSIX199309  1
#endif

#if defined _POSIX_C_SOURCE && (_POSIX_C_SOURCE - 0) >= 199506L
# define __USE_POSIX199506  1
#endif
_______________________________________________________________________

If, say, _XOPEN_SOURCE == 500 the rules say that it is not necessary to 
define _POSIX_SOURCE or _POSIX_C_SOURCE, but whatever they are set to, 
the effect as if _POSIX_C_SOURCE == 199506L (except that if 
_POSIX_C_SOURCE > 199506L, where the effect is undefined).

Should one or both of __USE_POSIX199309 and __USE_POSIX199506 be set if 
_XOPEN_SOURCE == 500 ?

Bug #2 ??


In cases where _POSIX_C_SOURCE is bigger than expected for the given 
_XOPEN_SOURCE the result does seem to be a mess -- but, hey, the 
standard says it's undefined !

Am I missing something, or should I report these as bugs ?

Chris



More information about the Libc-help mailing list