La semantica in linea C99 viene spesso fraintesa. L'identificatore inline
ha due scopi:
Innanzitutto, come suggerimento del compilatore in caso di dichiarazioni static inline
e extern inline
. La semantica rimane invariata se si rimuove lo specificatore.
secondo luogo, in caso di greggio inline
(cioè senza static
o extern
) per fornire una definizione in linea come alternativa a uno esterno, che deve essere presente in un'unità diversa traduzione. Non fornire quello esterno è un comportamento non definito, che si manifesterà normalmente come errore di collegamento.
Ciò è particolarmente utile se si desidera inserire una funzione in una libreria condivisa, ma anche rendere disponibile per l'ottimizzazione il corpo della funzione (ad esempio, allineamento o specializzazione). Supponendo un compilatore sufficientemente intelligente, questo consente di recuperare molti dei vantaggi dei modelli C++ senza dover passare attraverso i telai del preprocessore.
Nota che è un po 'più disordinata di quanto ho descritto qui come avere un altro file di portata dichiarazione esterna non in linea attiverà il primo caso, come descritto nella risposta Jens', anche se la definizione stessa è inline
invece di extern inline
. Questo è in base alla progettazione in modo che sia possibile avere una singola definizione in linea in un file di intestazione, che è possibile includere nel file di origine che fornisce quello esterno aggiungendo una singola riga per la dichiarazione esterna.
O renderlo 'static' o fornire una definizione non inline che il linker può trovare. –
Vedere anche http://stackoverflow.com/questions/6312597 – Jens