Condividi tramite


Funzioni inline alle macro

Sebbene le funzioni inline sono simili alle macro (perché il codice della funzione è espanso al momento della chiamata in fase di compilazione), le funzioni inline sono analizzate dal compilatore, mentre le macro vengono espanse dal preprocessore.Di conseguenza, esistono alcune differenze importanti:

  • Le funzioni inline seguono tutti i protocolli di indipendenza dai tipi applicati alle funzioni normali.

  • Le funzioni inline sono specificate utilizzando la stessa sintassi di qualsiasi altra funzione con la differenza che includono inline parola chiave nella dichiarazione di funzione.

  • Le espressioni passate come argomenti alle funzioni inline vengono valutate una volta.In alcuni casi, le espressioni passate come argomenti alle macro possono essere valutate più di uno volta.

Esempio

Nell'esempio seguente viene illustrata una macro che converte le lettere minuscole in lettere maiuscole:

// 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 );
}
  
  

Lo scopo dell'espressione toupper(getc(stdin)) è quello che un carattere deve essere letto dal dispositivo console (stdin) e, se necessario, la conversione in lettere maiuscole.

A causa dell'implementazione della macro, getc viene eseguito una volta per determinare se il carattere è maggiore o uguale a “a„, e per determinare una volta se è minore o uguale a “Z„. Se è in questo intervallo, getc viene eseguito di nuovo per convertire il carattere in maiuscolo.Ciò significa attende di programma due o tre caratteri quando, idealmente, deve attendere solo.

Le funzioni inline rimediano il problema descritto in precedenza:

// 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 );
}
  
  

Vedere anche

Riferimenti

inline, __inline, __forceinline