![]() |
Blitz Support : |
From: Julian Cummings (cummings_at_[hidden])
Date: 2005-05-18 16:57:48
Hi Derrick,
On Wed, 2005-05-18 at 14:15 -0700, Derrick Bass wrote:
> Ah, okay, I must be misremembering.
>
> Does
> #if defined(isnan)
> work?
No, I tried that. There does not seem to be a way to detect a macro
function like this.
But I did some more investigating in the GNU <cmath> header. They
define a templated isnan function in a special internal namespace that
redirects to another templated function. This second function template
has the same implementation as the original isnan macro function. They
also inject their templated isnan function into the std namespace, so
you can call isnan as std::isnan(x).
So I am adding an autoconf test to blitz for isnan being in namespace
std. If it is, then we call it with BZ_STD_SCOPE; otherwise, we call it
with BZ_IEEEMATH_SCOPE as before. This way, we can use std::isnan(x)
when available and avoid this whole macro function nonsense. This
definitely solves the problem reported under Mac OS X. Under Linux,
there was no problem because the <math.h> header actually provided an
isnan function in the global namespace, so ::isnan(x) worked.
-- Julian C.
>
> I think my solution would also work as well, but at the expense of more
> macros.
>
> Derrick
>
> On May 18, 2005, at 10:41 AM, Julian Cummings wrote:
>
> > Hi Derrick,
> >
> > I don't think the problem is that the configure script sees different
> > files than the actual code. The real problem here is that the line
> >
> > #ifdef isnan
> >
> > does not work as expected. This would detect if isnan were defined to
> > be a value like 1 or something. But when it is defined to be a macro
> > function, then it is not expanded unless it is followed by an argument
> > list. Unfortunately, doing something like
> >
> > #ifdef isnan(x)
> >
> > does not work either. I've tried some tricks using concatenation, but
> > none of them work quite like I had hoped. I don't think just adding
> > another macro will solve this problem. We need to figure out how to
> > get
> > the preprocessor to select the simple "return isnan(a);" line when
> > isnan
> > is a macro function. There must be a way to do this...
> >
> > -- Julian C.
> >
> >
> > On Tue, 2005-05-17 at 20:46 -0700, Derrick Bass wrote:
> >> Hmmm.... I recall having this problem a while back. I investigated for
> >> a bit and got very confused. It seems that some headers were defining
> >> isnan to be a macro but then other headers would undefine the macro
> >> and
> >> redefine it as a function. So the configure script would learn
> >> something different from the actual code. I ended up with a using
> >> declaration, which works in both cases:
> >>
> >> In funcs.h I had
> >> struct Fn_isnan {
> >> typedef int T_numtype;
> >>
> >> static inline T_numtype
> >> apply(T_numtype1 a)
> >> {
> >> #ifdef isnan
> >> // Some platforms define isnan as a macro, which causes the
> >> // BZ_IEEEMATHFN_SCOPE macro to break.
> >> return isnan(a);
> >> #else
> >> using namespace std;
> >> return isnan(a);
> >> #endif
> >> }
> >> ....
> >>
> >> and something similar in mathfunc.h. This fixes Mac OS X, but might
> >> break other platforms. I think we need a new macro so you can write
> >> something like:
> >> BZ_USING_IEEEMATHFN_NAMESPACE;
> >> instead of using namespace std.
> >>
> >> Of course, this all seems like a big hack. Someone needs to figure out
> >> why the configure script and the actual program see different header
> >> files, but I was not really able to trace through that craziness.
> >>
> >> Derrick
> >>
> >> On May 17, 2005, at 8:08 PM, Julian Cummings wrote:
> >>
> >>> The problem here is that cpp is not detecting that isnan is actually
> >>> a
> >>> macro function, not a normal function prototype. The blitz code uses
> >>>
> >>> #ifdef isnan
> >>>
> >>> to attempt to detect this situation, but it doesn't work. Is there a
> >>> cpp guru out there who knows the proper way to detect whether
> >>> something
> >>> is a cpp macro function or not? I've tried a few ideas, but no luck
> >>> thus far. Any help would be appreciated.
> >>>
> >>> Thanks, Julian C.
> >>>
> >>>
> >>> On Mon, 2005-05-16 at 22:42 -0700, Creon Levit wrote:
> >>>> checked out the latest cvs sources, ran autoreconf, configure, then
> >>>> make
> >>>> lib.
> >>>>
> >>>> ../blitz/mathfunc.h: In static member function `static int
> >>>> blitz::_bz_blitz_isnan<P_numtype1>::apply(P_numtype1)':
> >>>> ../blitz/mathfunc.h:1555: error: '::isnan' has not been declared
> >>>> ../blitz/funcs.h: In static member function `static int
> >>>> blitz::Fn_isnan<T_numtype1>::apply(T_numtype1)':
> >>>> ../blitz/funcs.h:587: error: '::isnan' has not been declared
> >>>> make[1]: *** [globals.lo] Error 1
> >>>> make: *** [blitz-library] Error 1
> >>>>
> >>>> Now, gcc definitely has namespaces, and so I know it wasn't the
> >>>> "right"
> >>>> thing to do, but I got it to build and pass all tests by changing
> >>>> line
> >>>> 138 of compiler.h from:
> >>>>
> >>>> #define BZ_IEEEMATHFN_SCOPE(x) ::x
> >>>>
> >>>> to:
> >>>>
> >>>> #define BZ_IEEEMATHFN_SCOPE(x) x
> >>>>
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> Blitz-support mailing list
> >>>> Blitz-support_at_[hidden]
> >>>> http://www.oonumerics.org/mailman/listinfo.cgi/blitz-support
> >>>>
> >>> --
> >>> Dr. Julian C. Cummings E-mail:
> >>> cummings_at_[hidden]
> >>> California Institute of Technology Phone: 626-395-2543
> >>> 1200 E. California Blvd., Mail Code 158-79 Fax: 626-584-5917
> >>> Pasadena, CA 91125 Office: 125 Powell-Booth
> >>>
> >>> _______________________________________________
> >>> Blitz-support mailing list
> >>> Blitz-support_at_[hidden]
> >>> http://www.oonumerics.org/mailman/listinfo.cgi/blitz-support
> >>>
> >>
> >>
> >> _______________________________________________
> >> Blitz-support mailing list
> >> Blitz-support_at_[hidden]
> >> http://www.oonumerics.org/mailman/listinfo.cgi/blitz-support
> >>
> > --
> > Dr. Julian C. Cummings E-mail:
> > cummings_at_[hidden]
> > California Institute of Technology Phone: 626-395-2543
> > 1200 E. California Blvd., Mail Code 158-79 Fax: 626-584-5917
> > Pasadena, CA 91125 Office: 125 Powell-Booth
> >
> > _______________________________________________
> > Blitz-support mailing list
> > Blitz-support_at_[hidden]
> > http://www.oonumerics.org/mailman/listinfo.cgi/blitz-support
> >
>
>