【问题标题】:How to disable long double in boost::math?如何在 boost::math 中禁用 long double?
【发布时间】:2021-12-10 20:11:54
【问题描述】:

我有 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 有区别吗?

【问题讨论】:

    标签: c++ boost long-double


    【解决方案1】:

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

    启动数学文档:Building a Library

    您需要问自己的第一件事是“我是否需要构建 有什么吗?” 因为这个库的大部分只是标题:意思 你可以通过#include必要的标题来使用它。

    对于大多数简单的用途,包含一个(或几个)头文件最适合编译 时间和程序大小。

    有关使用的优缺点,请参阅 C99 和 C++ TR1 C 样式函数 TR1 组件,而不是仅标题组件。

    您需要构建库的唯一时间是如果您想使用 在 中声明的 extern "C" 函数。

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

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

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

    后记

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

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

    在所有 Boost 1.77 中,唯一提到这些 boost/math/tr1.hpp 的库是 Multiprecision 和 Units - 但看起来他们非常注意不扩展宏并且从不显式调用 boost_* 符号。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多