2

对于 GCC 和 Clang,我可以轻松做到这一点:

    // absolute value
    inline constexpr int abs(const int number)
    { return __builtin_abs(number); }
    inline constexpr long abs(const long number)
    { return __builtin_labs(number); }
    inline constexpr long long abs(const long long number)
    { return __builtin_llabs(number); }
    inline constexpr double abs(const double& number)
    { return __builtin_fabs(number); }
    inline constexpr float abs(const float& number)
    { return __builtin_fabsf(number); }
    inline constexpr long double abs(const long double& number)
    { return __builtin_fabsl(number); }

这就像一个魅力。我想对几乎每个数学函数都做类似的事情,并且我的代码也可以在 MSVC 上运行。我怎样才能为 MSVC 做与上述相同的操作?

编辑:为了清楚起见:问题是关于__builtin_*功能,没有别的。我试过

#pragma intrinsic(abs)

但这需要一个 abs 函数的声明,我不想在我的全局命名空间中拥有它。

4

1 回答 1

1

内在函数不可移植,因此您必须手动查找相应的内置函数并将其添加到列表中,并使用它#ifdef来切换模式。

顺便说一句,您不必必须abs在全局命名空间中拥有:包含<cstdlib>而不是,<stdlib.h>您将得到std::abs

编译器知道他们自己的内在函数是什么,MSVC 使用/Oi 开关来启用它们。

于 2012-01-18T10:26:14.387 回答