Partager via


Fonctions inline et macros

Bien que les fonctions inline soient similaires aux macros (car le code de fonction est développé au point de l'appel au moment de la compilation), les fonctions inline sont analysées par le compilateur, alors que les macros sont développées par le préprocesseur. Par conséquent, il existe plusieurs différences importantes :

  • Les fonctions inline suivent tous les protocoles de sécurité de type appliqués sur les fonctions normales.

  • Les fonctions inline sont spécifiées à l'aide de la même syntaxe comme toute autre fonction, mais elles incluent le mot clé inline dans la déclaration de fonction.

  • Les expressions passées comme arguments aux fonctions inline sont évaluées une fois. Dans certains cas, les expressions passées comme arguments aux macros peuvent être évaluées plusieurs fois.

Exemple

L'exemple suivant montre une macro qui convertit les minuscules en majuscules :

// inline_functions_macro.c
#include <stdio.h>
#include <conio.h>

#define toupper(a) ((a) >= 'a' && ((a) <= 'z') ? ((a)-('a'-'A')):(a))

int main() {
   char ch;
   printf_s("Enter a character: ");
   ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

L'objectif de l'expression toupper(getc(stdin)) est qu'un caractère doit être lu à partir du périphérique de console (stdin) et, si nécessaire, être converti en majuscules.

Grâce à l'implémentation de la macro, getc est exécuté une fois pour déterminer si le caractère est supérieur ou égal à « a », et une fois pour déterminer s'il est inférieur ou égal à « z ». S'il est dans cette plage, getc est à nouveau exécuté pour convertir le caractère en majuscules. Cela signifie que le programme attend deux ou trois caractères lorsque, idéalement, il doit en attendre qu'un seul.

Les fonctions inline remédient au problème décrit auparavant :

// inline_functions_inline.cpp
#include <stdio.h>
#include <conio.h>

inline char toupper( char a ) {
   return ((a >= 'a' && a <= 'z') ? a-('a'-'A') : a );
}

int main() {
   printf_s("Enter a character: ");
   char ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

Voir aussi

Référence

inline, __inline, __forceinline