Secondo una regola Definizione (ODR), non posso avere una funzioneCome si verifica una situazione in cui diverse implementazioni di una funzione inline sono collegate in un eseguibile classificato?
void function()
{
}
definito più di una volta in un unico eseguibile - linker si opporrà. Tuttavia ODR viene ignorato per funzioni inline:
inline void function()
{
}
può essere definito in un file di intestazione che verrà #included in più file cpp e così quando risultanti obj file sono collegati tra loro il linker vede che ci sei diversi istanze di quella funzione e intenzionalmente la ignora. È presuppone che è la stessa funzione e utilizza solo una delle istanze. Poiché il comportamento del programma è preservato, nessuno si preoccupa.
Ma se per qualche ragione, use of preprocessor included, queste istanze hanno implementazioni diverse, il linker sceglierà nuovamente una delle funzioni e lo sviluppatore non saprà nemmeno quale verrà prelevato fino a quando non testerà accuratamente il suo programma.
Come si presenta l'ultima situazione quando il linker seleziona una delle funzioni e si verifica che abbiano implementazioni diverse classificate? Questo comportamento indefinito o qualsiasi altro tipo di situazione?
La risposta breve: rotto. – BCS