Subject: [boost] [Math.Constants] Help needed with the preprocessor
From: John Maddock (boost.regex_at_[hidden])
Date: 2011-12-16 13:23:52


Folks we have a problem: rather late in the day I've discovered that our
Math.Constants code doesn't compile on anything except VC++, and the problem
is preprocessor token pasting. So I'm hoping we have some experts around
here that can help!

The issue is we currently construct the constants from a macro invocation
such as:

  BOOST_DEFINE_MATH_CONSTANT(half, 5.000000000000000000000000000000000000,
00000000000000000000000000000000000000000000000000000000000000000000000000,
-01);

But the "-01" part (the exponent) isn't a valid pp-token, so trying to
token-paste it fails on GCC (compiler error).

Does anyone know if there's a way to overcome this?

As an alternative, I've considered something like:

  BOOST_DEFINE_MATH_CONSTANT(ln_two,
6.931471805599453094172321214581765680e-001,
"6.93147180559945309417232121458176568075500134360255254120680009493393621969694715605863326996418687542001481021e-001");

But this would still require token pasting of the

6.931471805599453094172321214581765680e-001

part. But is this now a valid pp-token if the "-" is internal to the token?
It works on the compilers I've tried, but I don't want to be skewered by
this again down the line....

Truly hating the preprocessor yours, John.