2012-02-16 8 views
16

Lo standard dice che comporta una dichiarazione diPerché le funzioni in linea hanno un collegamento esterno per impostazione predefinita?

inline void foo(); 

che foo è un inline function with external linkage (perché per impostazione predefinita tutte le dichiarazioni di funzione hanno collegamento esterno). Questo mi sembra strano. poiché la regola della regola una definizione 3.2 (in C++ 03 e C++ 11) dice:

3 ... Una funzione in linea deve essere definita in ogni unità di traduzione in cui viene utilizzata.

5 Ci può essere più di una definizione di una [n] ... funzione inline con collegamento esterno (7.1.2) ... Data una tale entità denominata D definita in più di un'unità di traduzione ... ciascuna definizione di D comprende la stessa sequenza di token

Ciò significa che una funzione inline potrebbe anche avere collegamento interno, perché l'uso della funzione in qualsiasi modo, attraverso un comando esterno (cioè, attraverso unità di traduzione) sarebbe deve invocare un comportamento non definito (dal paragrafo 3) e che il contenuto della funzione inline in tutte le unità di traduzione deve essere lo stesso.

Esiste una retrocompatibilità o un motivo specifico per la catena di strumenti per questa regola?

+0

Credo che [questo] (http://www.glenmccl.com/ansi_015.htm) risponda alla domanda. –

+0

@Als: questo discute le insidie, ma non il motivo per cui tale modifica è stata apportata. –

+0

Se lo leggi completamente, Dice: * "La motivazione immediata di questo cambiamento era la necessità del nuovo modello di compilazione dei template adottato nello stesso incontro, ma più in generale si è ritenuto che cambiare il valore predefinito fosse un'idea il cui tempo era arrivato, e il cambiamento è stato approvato all'unanimità sia in ANSI che in ISO "*. –

risposta

17

Un risultato di tale decisione è che una variabile statica definita all'interno di una funzione inline verrà condivisa tra tutte le istanze della funzione. Se l'impostazione predefinita era il collegamento interno, ogni unità di traduzione avrebbe ottenuto la propria copia della variabile statica. Non è così che le persone si aspettano che le cose funzionino: in linea o non in linea non dovrebbero influenzare la semantica del codice in modo così drastico.

9

Questo è giustamente risposto qui dall'articolo di Jonathan Schilling: Extern Inlines By Default.

per citare lui di motivazione di questo cambiamento:

La motivazione immediata per questo cambiamento è stato un bisogno del nuovo modello modello di compilazione che è stata adottata nel corso della stessa riunione; ma più in generale si è ritenuto che cambiare il default fosse un'idea il cui tempo era arrivato, e il cambiamento è stato approvato all'unanimità sia in ANSI che in ISO.