La norma sembra implicare che non v'è alcun limite al numero di definizioni di una variabile se non è ODR-utilizzato (§3.2/3):Se non utilizzo una variabile, posso avere più definizioni di essa tra le unità di traduzione?
Ogni programma deve contenere esattamente un definizione di ogni funzione non in linea o variabile che è odr-usata in quel programma; nessuna diagnostica richiesta.
Si fa dire che qualsiasi variabile non può essere definita più volte all'interno di un'unità di traduzione (§3.2/1):
Nessuna unità traduzione deve contenere più di una definizione di qualsiasi variabile, funzione , tipo di classe, tipo di enumerazione o modello.
Ma non riesco a trovare una restrizione per le variabili non odr-utilizzate in tutto il programma. Allora, perché non posso compilare qualcosa di simile al seguente:
// other.cpp
int x;
// main.cpp
int x;
int main() {}
compilazione e collegamento questi file con g ++ 4.6.3, ottengo un errore di linker per multiple definition of 'x'
. Per essere onesti, mi aspetto questo, ma dal momento che lo x
non è usato da nessun'altra parte (per quanto ne so io), non riesco a vedere come lo standard lo limiti. O è un comportamento indefinito?
Come si arriva alla conclusione che i due nomi 'x' non denotano la stessa variabile? – ecatmur
@ecatmur: Ci sono due variabili perché ci sono due definizioni: 'int x;' definisce una variabile con durata di memorizzazione statica. Ci sono due definizioni di questo tipo, quindi ci sono due variabili.Se il programma fosse modificato come suggerito da Luc Danton, ci sarebbe solo una variabile perché ci sarebbe solo una definizione ('extern int x;' non è una _definizione_ di 'x', è solo una _declaration_). –
Se invece di 'int x;' le dichiarazioni hanno la forma 'class y {};' o 'namespace z {}' (entrambe le definizioni), i nomi 'y' e' z' denoterebbero rispettivamente lo stesso tipo o spazio dei nomi . In che modo la variabile 'x' è diversa? – ecatmur