Funzioni inline e macro
Sebbene le funzioni inline siano simili alle macro (perché il codice della funzione viene espanso, in fase di compilazione, al momento della chiamata), le funzioni inline vengono analizzate dal compilatore, mentre le macro vengono espanse dal preprocessore. Di conseguenza, vi sono molte importanti differenze:
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 la parola chiave inline nella dichiarazione di funzione.
Le espressioni passate come argomenti alle funzioni inline sono valutate una sola volta. In alcuni casi, le espressioni passate come argomenti alle macro possono essere valutate più volte.
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)) è che un carattere venga letto dal dispositivo di console (stdin) e, se necessario, convertito in lettere maiuscole.
A causa dell'implementazione della macro, getc viene eseguito una volta, per determinare se il carattere è maggiore o uguale ad "a", e una volta per determinare se è minore o uguale a "Z". Se si trova in questo intervallo, getc viene eseguito nuovamente per convertire il carattere in lettere maiuscole. Ciò significa che il programma attende due o tre caratteri, quando l'ideale sarebbe che ne attendesse uno solo.
Le funzioni inline rimediano al 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 );
}