Appel de MSVC intégré / intrinsèques pour les fonctions mathématiques C
-
28-10-2019 - |
Question
Pour GCC et Clang, je peux facilement faire ceci:
// 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); }
Ce qui fonctionne comme un charme.J'aimerais faire une chose similaire pour à peu près toutes les fonctions mathématiques et faire fonctionner mon code sur MSVC également.Comment puis-je faire l'équivalent de ce qui précède pour MSVC?
EDIT : pour plus de clarté: la question concerne les fonctions __builtin_*
, rien d'autre.J'ai essayé
#pragma intrinsic(abs)
mais cela nécessite une déclaration de la fonction abs, que je ne voudrais pas avoir dans mon espace de noms global.
La solution
Les fonctions intrinsèques ne sont pas portables, vous devrez donc rechercher manuellementfonction intégrée correspondante et ajoutez-la à la liste, et utilisez #ifdef
pour changer de mode.
Vous n'êtes pas obligé d'avoir abs
dans l'espace de noms global, d'ailleurs: incluez <cstdlib>
au lieu de <stdlib.h>
et vous obtiendrez le std::abs
à la place.
Les compilateurs savent ce que sont leurs propres intrinsèques, MSVC utilise le commutateur / Oi pour les activer.