2010-11-10 7 views
7

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?

+1

La risposta breve: rotto. – BCS

risposta

6

Sì, è UB per funzioni inline con collegamento esterno (penso che sia ciò che l'OP intende).

$ 3,2/5-

Ci può essere più di una definizione di un tipo di classe (clausola 9), tipo censimento (7.2), in linea funzione con linkage esterno (7.1.2) , modello di classe (clausola 14), modello di funzione non statica (14.5.5), membro di dati statici di un modello di classe (14.5.1.3), funzione membro di un modello di classe (14.5.1.1) o modello Specializzazione per la quale alcuni parametri del modello non sono t specificato (14.7, 14.5.4) in un programma a condizione che ciascuna definizione sia visualizzata in un'unità di traduzione diversa e che le definizioni soddisfino i seguenti requisiti .

Dato come un'entità denominato D definito in più di un'unità di traduzione, allora

- ciascuna definizione di D sono consisterà nella stessa sequenza di token; e

Lo stesso paragrafo alla fine afferma che il mancato soddisfare questi requisiti porta a UB

+0

Si prega di non utilizzare la parola "para" significa qualcosa di completamente diverso dal paragrafo. –

+0

@Matt Joiner: l'ho cambiato. Scusa se significa qualcosa di indesiderato. – Chubsdad

Problemi correlati