Se dichiari una funzione "inline", allora il codice sarà riprodotto nel punto di chiamata ognivolta che chiami la funzione. Attenzione che è necessario definire il codice della funzione prima della sua prima chiamata, altrimenti un compilatore potrebbe non essere in grado di espanderlo.
Ndt: Infatti il codice delle funzioni inline deve essere espanso, non deve essere generata solo una chiamata (questa è la differenza!)
Questo è il motivo per cui il codice delle funzioni inline è generalmente messo nel file header che dichiara le funzioni inline stesse.
inline int addition (int a, int b)
{
return a + b;
}
Ma puoi anche definire la funzione in due passi:
inline int addition (int a, int b); // qui la keyword inline è opzionale
... // qui però addition non deve ancora essere usata
inline int addition (int a, int b)
{
return a + b;
}
Usare le funzioni inline probabilmente sarà più efficiente,
perchè la maggior parte dei compilatori C++ prima sostituirà
il codice, e poi lo ottimizzerà. Ma la dimensione del codice può
aumentare di parecchio. Perciò è raccomandabile usare inline
solo per piccole funzioni (costruttori e operatori di classe sono degli
ottimi esempi che vedremo).
Ecco un esempio di codice per quelli che non vedono la differenza tra le
funzioni inline e una #define:
#define SQUARE(x) ((x) * (x))
int a = 2;
int b = SQUARE (a++);
// alla fine: a = 4 e b = 2 * 3 = 6. Sorpreso ?!
inline int square (int x)
{
return x * x;
}
int c = 2;
int d = square (c++);
// alla fine: c = 3 e d = 2 * 2 = 4. Risultati corretti come ci aspettavamo !!
Nota: con il compilatore C della GNU (GCC) succede una cosa curiosa
quando si chiama la macro SQUARE(a++): il risultato in b è corretto
(virtù di GCC che farà felice tutti i programmatori C), però il valore
finale di a è ancora 4 e non 3. Tuttavia è possibile risolvere una
volta per tutte anche questo problema usando un paio di estensioni del
GNU C, che sono i Naming Types e le Statement Exprs. Ecco la
soluzione:
/* questo è GNU-specific :) */
#define SQUARE(x) \
({typedef _tx = (x); \
_tx _x=(x); _x*_x; })
In questo modo x viene valutato solo una volta.
Per saperne di più sulle estensioni C e C++ di GCC digitate al prompt:
info gcc "C Extensions"oppure
info gcc "C++ Extensions"