2011-12-22 11 views
6

Se eseguo una funzione in linea, cambia il suo collegamento con il collegamento interno? Per esempio: sto usando o chiamando la funzione inline in due file:La funzione inline influisce sul suo collegamento?

file1.cpp 

//function definition 
inline void foo() {} 

file2.cpp 
//function definition 
inline void foo() {} 

Perché ho bisogno di definire la funzione inline in ogni file per essere in grado di chiamare? Sto ottenendo un collegamento interno? Cosa succede se uso static inline?

+0

Mentre so che il tag è C++, è bene sapere che inline in C sono il collegamento interno predefinito, l'opposto di C++ –

+0

@Jesse: No, non è il contrario. La funzione Inline C (C99) ha anche il collegamento esterno per impostazione predefinita a meno che non venga dichiarata statica. – user1086635

+0

@ user1086635: No, in C l'impostazione predefinita è il collegamento interno. C99 6.7.4/6 dice "Una definizione in linea non fornisce una definizione esterna per la funzione, e non vieta una definizione esterna in un'altra unità di traduzione.", Dando un esempio creando una definizione esterna con una dichiarazione extra 'extern' . –

risposta

10

Se eseguo una funzione in linea, cambia il collegamento con il collegamento interno?

No, rendendolo in linea non cambia il suo legame.

Perché ho bisogno per definire la funzione inline in ogni file per essere in grado di chiamarla?

Perché la lingua lo richiede. C++ 11 7.1.2/4 dice "Una funzione inline deve essere definita in ogni unità di traduzione in cui è odr-used e deve avere esattamente lo la stessa definizione in ogni caso."

Ricevo un collegamento interno?

No, ha ancora linkage esterno: un puntatore alla funzione avrà lo stesso valore in ogni unità di traduzione, ed eventuali oggetti statici dichiarati all'interno della funzione sarà lo stesso oggetto in qualsiasi unità di traduzione.

Cosa succede se uso static inline?

Questo darà il collegamento interno, a causa del static. Ciò significa che le definizioni in unità di traduzione separate produrranno funzioni separate, con indirizzi diversi e copie distinte di qualsiasi oggetto statico.

+0

Ok, se avessi ciascuna funzione inline dichiarata come 'statica' in questi due file, in che modo influenzerebbe il mio programma? Perché anche se le funzioni hanno un collegamento estensionale, le loro definizioni devono ancora essere presenti in ogni file. – user1086635

+1

@ user1086635: Se li dichiarate 'static', allora ognuno sarà una funzione separata; ad esempio, i loro indirizzi saranno diversi e ognuno avrà la propria copia di qualsiasi dato statico. Con il collegamento esterno, avranno lo stesso indirizzo e condivideranno i dati statici. –

+0

La nota sui puntatori a un inline non è specificata. Possono esistere più copie della funzione inline, poiché ogni unità di traduzione ottiene una copia. Quindi non è definito come un _linker_ lo risolva.Se si viola la regola ODR è possibile ottenere risultati strani come chiamate diverse funzioni. Quindi non puoi assumere che i puntatori saranno uguali, anche se segui l'ODR. –

Problemi correlati