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

Для 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, которую я не хотел бы иметь в моем глобальном пространстве имен.

1 Ответ

1 голос
/ 18 января 2012

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

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

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

...