Re: Feature Conditional for M_PI
Yaakov Selkowitz via Newlib <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
On Mon, 2020-08-31 at 16:19 -0500, Joel Sherrill via Newlib wrote: > On Mon, Aug 31, 2020 at 3:05 PM Corinna Vinschen via Newlib < > [email protected]> wrote: > > > On Aug 31 10:50, Joel Sherrill wrote: > > > On Mon, Aug 31, 2020 at 10:30 AM Corinna Vinschen via Newlib < > > > [email protected]> wrote: > > > > > > > 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. > > > > Actually, Yaakov pointed out on IRC that this is a C++ problem on Linux. > > You're running the above test with g++. If you perform the third test > > with gcc on Linux: > > > > gcc -D_POSIX_C_SOURCE=200809L -c m.c > > > > you'll get the same error as on newlib and FreeBSD: > > > > m.c: In function ‘main’: > > m.c:8:15: error: ‘M_PI’ undeclared (first use in this function) > > 8 | double pi = M_PI; > > | ^~~~ > > m.c:8:15: note: each undeclared identifier is reported only once > > for each function it appears in > > > > The problem in glibc and/or g++ is that this does *not* occur when > > building with g++. > > > > Thanks. I was building with g++ because the code this came up in was C++. > In the application, I just defined the proper thing to make it visible. > > Was this the right thing to do? Or is there something else wrong? Honestly, > the odd C library things that happen from C++ is often hard to explain. Yes, that is the correct solution. Unfortunately, the work to automatically make visible the symbols required by various C++ standards hasn't been done in glibc, therefore on Linux targets, G++ defines _GNU_SOURCE which enables everything. To that end, newlib/cygwin are actually more correct than glibc, but this is the price for being correct. Fixing this in glibc and g++ has been on my to-do wish list since the newlib/cygwin FTMs were finished, but I just haven't had the time. -- Yaakov Selkowitz Senior Software Engineer - Platform Enablement Red Hat, Inc.