如何在 boost::math 中禁用 long double?

How to disable long double in boost::math?

我有 C++ 源文件,example.cpp,使用了一些 boost::math 函数。

我的boost库也建好了

要在 boost::math 中禁用 long double,我执行了以下操作:

g++ -DBOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS example.cpp -I<boost_header> -L<boost.*.so>

我的问题是我是否需要用 -DBOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS 重建 boost 库?或者,换句话说,boost 库在使用宏和不使用宏时是否有所不同 BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS?

是的,可能会有所不同。然而,在实践中,通常不会有:

引导数学文档:Building a Library

The first thing you need to ask yourself is "Do I need to build anything at all?" as the bulk of this library is header only: meaning you can use it just by #including the necessary header(s).

For most simple uses, including a header (or few) is best for compile time and program size.

Refer to C99 and C++ TR1 C-style Functions for pros and cons of using the TR1 components as opposed to the header only ones.

The only time you need to build the library is if you want to use the extern "C" functions declared in <boost/math/tr1.hpp>.

因为 tr1.hpp 实际上使用了 BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS 宏,所以是的,可能会有相关的差异。

事实上,从快速扫描来看,自动链接(在 MSVC 上)似乎仅在 定义预处理器条件时引起。这意味着在定义符号时完全不需要构建库。尝试 not 链接到库以检查该假设:

g++ -DBOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS example.cpp -I<boost_header>

Post 脚本

libs/math/src 中定义的唯一用途是 boost_nexttowardboost_nexttowardf

所以除非你使用这些,否则应该没有问题。

在所有 Boost 1.77 中,唯一提及这些 boost/math/tr1.hpp 的库是多精度和单位 - 但看起来他们非常小心地不扩展宏并且从不显式调用 boost_* 符号。

总而言之,您只是在自己的代码中寻找对 [boost_]nexttoward[f] 直接 调用。