为 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”?

C++调用matlab数学函数问题

Python函数:内置函数(数学运算函数类型转换函数)

MSVC:以64位代码读取特定的64位或32位寄存器(例如R10)?

红帽linux中C语言编程如何调用数学函数

第七篇 python基础之函数,递归,内置函数