2012-10-11 16 views
23

Qualcuno può dirmi qual è la differenza tra una funzione inline e una funzione inline statica?Differenza tra una funzione inline e una funzione inline statica

In quali casi, preferisco statico in linea su inline?

Sto facendo questa domanda perché ho una funzione inline per la quale sto affrontando problemi di compilazione durante il collegamento (relocation error:... symbol has been discarded with discarded section ...). L'ho reso una funzione normale e ha funzionato. Ora alcuni dei miei anziani mi hanno detto di provare con la linea statica. Qui di seguito è la mia funzione:

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1) 
{ 
    wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name); 
    notifier->notify (arg, aspect); 
} 

e questo non all'interno di una classe. Questo è all'interno di un file di intestazione!

Immagino che la chiamata a una funzione statica debba essere eseguita solo nella TU specifica in cui è definita.

Dato che la mia funzione si trova in un file di intestazione e se la faccio statica, sarà sempre possibile che includo il file di intestazione utilizzato dalla funzione statica in quell'unità di traduzione?

+0

Questa funzione è all'interno di una classe? Si prega di inviare anche la sua dichiarazione. – anatolyg

+1

è ':: wizNtrKit' un oggetto statico? qual è il suo collegamento? – Walter

+0

Inoltre, dove appare la funzione? File di intestazione, file sorgente? Quanti file sorgente lo includono? –

risposta

36

La dichiarazione di funzione non statica inline fa riferimento alla stessa funzione in ogni unità di traduzione (file di origine) che la utilizza.

La regola One Definition richiede che il corpo della definizione della funzione sia identico in ogni TU che lo contiene, con una definizione di "identico" piuttosto lunga. Di solito ciò è soddisfatto a condizione che tutti i file di origine utilizzino la stessa intestazione e che la funzione non utilizzi nomi globali con collegamento interno (incluse le funzioni static) o qualsiasi macro definita in modo diverso in diverse TU.

Non ricordo di aver incontrato prima quel particolare errore del linker, ma è almeno possibile che una di queste restrizioni sia responsabile. È tua responsabilità soddisfare i requisiti: comportamento non definito senza diagnostica necessaria se non lo fai.

La dichiarazione di funzione static inline fa riferimento a una funzione diversa in ogni unità di traduzione, che per caso ha lo stesso nome. Può utilizzare nomi globali o macro static diversi in diverse TU, nel qual caso la funzione potrebbe comportarsi diversamente nelle diverse TU, anche se la sua definizione nel file di intestazione "sembra la stessa".

A causa di questa differenza, se la funzione contiene qualsiasi variabile locale static, si comporta diversamente a seconda che sia static o meno. Se è static, ciascuna TU dispone di una propria versione della funzione e quindi della propria copia delle variabili locali static. Se è solo inline, c'è una sola copia delle variabili locali static utilizzate da tutte le TU.

+2

Nota: nel caso di funzioni 'statiche', il bit' inline' perde il suo significato semantico (* va bene se quella definizione di funzione appare in più TU *); l'unica cosa che rimane legata a 'inline' è un semplice suggerimento per il compilatore, che quasi ignora. –

+0

Sì, quello che dico sulla funzione 'inline' sarebbe anche vero per le dichiarazioni di funzione che non sono né' static' né 'inline', ad eccezione del requisito di una regola di definizione.Invece di richiedere definizioni identiche in ogni TU, richiederebbe che solo una TU contenga una definizione. Dato che il codice del questionario funziona quando 'inline' viene rimosso sospetto che ci sia qualcosa di divertente in corso qui - ti aspetteresti un errore di linker se è definito in più TU. Non credo sia necessaria una diagnosi, ma non è difficile per il linker. –

Problemi correlati