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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top