Feature Conditional for M_PI
Corinna Vinschen
vinschen@redhat.com
Mon Aug 31 15:29:59 GMT 2020
On Aug 31 17:27, Corinna Vinschen via Newlib wrote:
> On Aug 31 10:10, Joel Sherrill wrote:
> > Hi
> >
> > I was porting some code from Linux to Cygwin and came across this. M_PI in
> > math.h is defined by POSIX as part of XSI. It does not appear to be part of
> > C99 or C++03. I have this cut down to show the problem:
> >
> > ==========================
> > #include <math.h>
> >
> > double pi = M_PI;
> > ==========================
> >
> > And this script to try various feature defines and compilers:
> >
> > ===========================
> > GCC=${GCC:-g++}
> >
> > ${GCC} -c m.c
> > ${GCC} -D_XOPEN_SOURCE=700 -c m.c
> > ${GCC} -D_POSIX_C_SOURCE=200809L -c m.c
> > ${GCC} -D_XOPEN_SOURCE=700 -c -D_POSIX_C_SOURCE=200809L -c m.c
> > ===========================
> >
> > All of those compiler invocations work on Linux but the third one does not
> > work on Cygwin or RTEMS which use newlib.
> >
> > Is the proper thing to do to add -D_XOPEN_SOURCE=700 when compiling this
> > program?
> >
> > Just curious if Linux is defining _XOPEN_SOURCE by default and newlib
> > doesn't.
>
> In glibc's math.h, M_PI is guarded with
>
> #if defined __USE_MISC || defined __USE_XOPEN
>
> In newlib, it's guarded with
>
> #if __BSD_VISIBLE || __XSI_VISIBLE
>
> Note that this is identical to the guards on at least FreeBSD.
>
> In both cases, newlib as well as glibc, "MISC" is defined by default,
> but "BSD" isn't. That's why your 3rd invocation fails on BSDs and
> newlib/Cygwin, but not on Linux.
Huh, wait! I bet this does *not* fail on BSD because BSD very likely
defines __BSD_VISIBLE by default.
We could move the math.h constants to __MISC_VISIBLE || __XSI_VISIBLE,
perhaps that makes more sense for us?
Corinna
More information about the Newlib
mailing list