为 C 数学函数调用 MSVC 内置/内在函数
Posted
技术标签:
【中文标题】为 C 数学函数调用 MSVC 内置/内在函数【英文标题】:Calling MSVC builtin/intrinsics for C math functions 【发布时间】:2012-01-15 17:13:56 【问题描述】:对于 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 函数的声明,我不想在我的全局命名空间中拥有它。
【问题讨论】:
有一个响应链接到 MSVC 中可用的内在函数:***.com/questions/355967/… 你是问微软的编译器是否支持constexpr
?答案是否定的,不适用于 Visual Studio 2010 或下一版本 VS 11。
IIRC 你甚至不需要这样做 - 我相信有一个编译器开关可以确定是否使用内置函数而不是库函数?
【参考方案1】:
内部函数不可移植,因此您必须手动 look up the corresponding builtin function 并将其添加到列表中,并使用 #ifdef
切换模式。
顺便说一句,您不必在全局命名空间中包含abs
:包括<cstdlib>
而不是<stdlib.h>
和you will get std::abs
。
编译器知道他们自己的内在函数是什么,MSVC 使用the /Oi switch 来启用它们。
【讨论】:
以上是关于为 C 数学函数调用 MSVC 内置/内在函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MSVC++6 中声明 IEEE 数学函数,如“ilogbf”?