Вызов встроенных/внутренних функций MSVC для математических функций C

Для 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?

EDIT: для ясности: вопрос касается функций __builtin_* и ни о чем другом. Я пытался

#pragma intrinsic(abs)

но для этого требуется объявление функции abs, которую я бы не хотел иметь в моем глобальном пространстве имен.


person rubenvb    schedule 15.01.2012    source источник
comment
На это есть ответ, который ссылается на доступные встроенные функции в MSVC: of-this-gcc-code" title="как использовать встроенные функции msvc для получения эквивалента этого кода gcc"> stackoverflow.com/questions/355967/   -  person Joe    schedule 15.01.2012
comment
Вы спрашиваете, поддерживается ли constexpr в компиляторе Microsoft? Ответ — нет, не для Visual Studio 2010 или следующей версии VS 11.   -  person Cody Gray    schedule 15.01.2012
comment
IIRC вам даже не нужно это делать - я полагаю, что есть переключатель компилятора, который определяет, используются ли встроенные модули вместо библиотечных функций?   -  person Paul R    schedule 15.01.2012


Ответы (1)


Встроенные функции не переносимы, поэтому вам придется вручную найти соответствующую встроенную функцию. и добавьте его в список, а затем используйте #ifdef для переключения режимов.

Кстати, вам не обязательно иметь abs в глобальном пространстве имен: включите <cstdlib> вместо <stdlib.h> и вместо этого вы получите std::abs.

Компиляторы знают, каковы их собственные встроенные функции, MSVC использует /Oi переключатель, чтобы включить их.

person spraff    schedule 18.01.2012