Recommandations pour le choix entre des fonctions et des macros

La plupart des routines de bibliothèque du Runtime Microsoft sont des fonctions compilées ou assemblées, mais certaines routines sont implémentées sous forme de macros. Lorsqu’un fichier d’en-tête déclare une fonction et une version macro d’une routine, la définition de macro est prioritaire, car elle apparaît toujours après la déclaration de fonction. Lorsque vous appelez une routine qui est implémentée à la fois comme une fonction et comme une macro, vous pouvez forcer le compilateur à utiliser la version de la fonction de deux manières :

  • Mettre entre parenthèses le nom de la routine.

    #include <ctype.h>
    a = _toupper(a);    // Use macro version of toupper.
    a = (_toupper)(a);  // Force compiler to use
                        // function version of toupper.
    
  • « Annuler la définition » de la définition de macro avec la directive #undef :

    #include <ctype.h>
    #undef _toupper
    

Si vous devez choisir entre une implémentation de fonction et de macro d’une routine de bibliothèque, considérez les compromis suivants :

  • Vitesse et taille Le principal avantage de l’utilisation des macros est la durée d’exécution plus rapide. Pendant le prétraitement, une macro est développée (remplacée par sa définition) inline chaque fois qu’elle est utilisée. Une définition de fonction ne se produit qu’une seule fois, quel que soit le nombre de fois qu’elle est appelée. Les macros peuvent augmenter la taille du code, mais n’ont pas la surcharge associée aux appels de fonction.

  • L’évaluation de fonction Une fonction prend la valeur d’une adresse ; une macro ne le fait pas. Vous ne pouvez donc pas utiliser un nom de macro dans les contextes nécessitant un pointeur. Par exemple, vous pouvez déclarer un pointeur vers une fonction, mais pas un pointeur vers une macro.

  • Vérification de type Lorsque vous déclarez une fonction, le compilateur peut vérifier les types d’arguments. Étant donné que vous ne pouvez pas déclarer de macro, le compilateur ne peut pas case activée types d’arguments de macro ; bien qu’il puisse case activée le nombre d’arguments que vous passez à une macro.

Voir aussi

Mathématiques de type générique
Fichiers C runtime (CRT) et bibliothèque standard C++ (STL) .lib