Use _j[0,1,n]() Bessel functions on MSVC to avoid deprecation errors. - Microsoft deprecated the POSIX Bessel functions: j[0,1,n]() in favour of _j[0,1,n](), it appears since at least MSVC 2005: https://msdn.microsoft.com/en-us/library/ms235384(v=vs.100).aspx. - As this occurs in jet.h (templated public header), although Ceres suppresses the warning when it itself is built (to suppress a warning about the insecurity of using std::copy), it will crop up again in client code (without this fix) unless it is explicitly suppressed there also. - Raised as Issue #190: https://github.com/ceres-solver/ceres-solver/issues/190. Change-Id: If7ac5dbb856748f9900be93ec0452a40c0b00524
diff --git a/include/ceres/jet.h b/include/ceres/jet.h index b89f807..fc98d44 100644 --- a/include/ceres/jet.h +++ b/include/ceres/jet.h
@@ -506,9 +506,32 @@ } // Bessel functions of the first kind with integer order equal to 0, 1, n. -inline double BesselJ0(double x) { return j0(x); } -inline double BesselJ1(double x) { return j1(x); } -inline double BesselJn(int n, double x) { return jn(n, x); } +// +// Microsoft has deprecated the j[0,1,n]() POSIX Bessel functions in favour of +// _j[0,1,n](). Where available on MSVC, use _j[0,1,n]() to avoid deprecated +// function errors in client code (the specific warning is suppressed when +// Ceres itself is built). +inline double BesselJ0(double x) { +#if defined(_MSC_VER) && defined(_j0) + return _j0(x); +#else + return j0(x); +#endif +} +inline double BesselJ1(double x) { +#if defined(_MSC_VER) && defined(_j1) + return _j1(x); +#else + return j1(x); +#endif +} +inline double BesselJn(int n, double x) { +#if defined(_MSC_VER) && defined(_jn) + return _jn(n, x); +#else + return jn(n, x); +#endif +} // For the formulae of the derivatives of the Bessel functions see the book: // Olver, Lozier, Boisvert, Clark, NIST Handbook of Mathematical Functions,