Errore di definizione multipla in c++
Quando una funzione o una variabile ha diverse definizioni in vari file di origine, la procedura di collegamento si traduce in un errore di definizione multipla. Per garantire l'uniformità e l'accuratezza del programma, il linker prevede solo una definizione in tutti i file di origine.
In genere, l'errore sembra questo:
Errore: definizione multipla di 'function_name'È fondamentale per ogni sviluppatore C ++ comprendere la causa di questo errore e sapere come risolverlo.
Fattori che portano a più errori di definizione in C++
Errori di definizione multipli possono verificarsi nel codice C ++ per diversi motivi come discusso di seguito:
1: definizioni multiple della stessa funzione o variabile in un file di origine
Se si definisce accidentalmente la stessa funzione o variabile più volte nello stesso file di origine, si verificherà un errore di definizione multipla.
2: funzione o variabile definita in un file di intestazione
Quando una funzione o una variabile viene dichiarata in un file di intestazione e quel file di intestazione viene referenziato da numerosi file di origine, qualsiasi file di origine che ha un'intestazione conterrà anche una definizione per la funzione o la variabile. Questo genera l'errore di più definizioni.
3: dichiarare la stessa funzione o variabile più volte nello stesso file di origine
Se si dichiara accidentalmente la stessa funzione o variabile più volte nello stesso file di origine, si verificano un errore di definizione a più. Questo perché il linker prevede solo una definizione per ciascuna funzione o variabile in tutti i file di origine.
Correggi l'errore con più definizioni di una funzione in C++
Le seguenti tecniche possono essere utilizzate per correggere più errori di definizione in C ++:
1: utilizzare prototipi di funzioni e variabili esterne
Una tecnica per correggere più errori di definizione in C ++ è dichiarare una funzione o una variabile usando prototipi di funzione o variabili esterne, anziché specificarli in un file di intestazione. In tal modo, la funzione o la variabile verranno definite solo una volta nel file di origine, evitando così l'errore.
Quanto segue è una sintassi del codice per la soluzione sopra.
// intestazione.HNella sintassi sopra, la funzione sub è dichiarato nel file di intestazione utilizzando la parola chiave esterna, che indica che è definita altrove. La definizione effettiva viene quindi fornita nel file di origine. IL #ifndef header_h E #define header_h Le righe includono guardie che assicurano che il file di intestazione sia incluso solo una volta nello stesso file di origine per evitare di ridefinire la funzione.
2: utilizzare funzioni o variabili statiche
Se una funzione o una variabile viene utilizzata solo in un file di origine, dichiararla statica. Ciò limita il suo ambito al file di origine corrente e il linker non lo prenderà in considerazione durante il collegamento. In tal modo, si assicura che la funzione o la variabile siano definite solo una volta e non si può accedere da altri file.
Dichiarare una funzione o una variabile come statico limita il suo ambito al file di origine corrente e garantisce che sia definito solo una volta, rendendo il codice più modulare e più facile da mantenere
Inoltre, se hai più funzioni in file diversi, è possibile utilizzarle facilmente in qualsiasi altro progetto.
Considera la seguente sintassi del codice come esempio:
// funzioni.CPPNella sintassi sopra, il "statico" La parola chiave viene utilizzata per definire una funzione chiamata "Un tempo_used_function". Questa funzione è accessibile solo all'interno dello stesso file di origine e non è possibile accedere da altri file collegati a questo file di origine. Ciò garantisce che la funzione sia definita solo una volta e non può essere modificata o accessibile accidentalmente da altre parti del programma.
3: implementare le funzioni in linea
Prendi in considerazione l'uso di funzioni inline per funzioni frequentemente chiamate brevi. Ciò eliminerà la necessità di una definizione separata, poiché il compilatore può sostituire la chiamata della funzione con il codice della funzione direttamente.
Considera la seguente sintassi del codice come esempio:
// intestazione.HNella sintassi sopra, la parola chiave "inline" viene utilizzata per definire una funzione chiamata "sub", che prende due argomenti interi e restituisce la loro differenza. Definendo questa funzione come in linea, il compilatore sostituirà la chiamata della funzione con il codice funzione effettivo al momento della compilazione, eliminando la necessità di una definizione di funzione separata.
4: Utilizza spazi dei nomi
Usando gli spazi dei nomi, è possibile impedire al linker di trovare più definizioni con lo stesso nome. Gli spazi dei nomi forniscono un modo per raggruppare dichiarazioni e definizioni correlate in un unico ambito nominato, rendendo più semplice l'organizzazione e la gestione di grandi basi di codice.
Considera la seguente sintassi del codice come esempio:
// source_code_1.CPPNella sintassi sopra, due diversi file di origine hanno una funzione chiamata "sub" con la stessa firma. Per evitare i conflitti di denominazione, ogni funzione è definita all'interno di uno spazio dei nomi separato: "Source_code_1" e "Source_code_2". In questo modo, è possibile accedere alle funzioni all'interno dei rispettivi spazi dei nomi senza causare conflitti di denominazione. Quando si chiama la funzione da altre parti della base di codice, è necessario specificare lo spazio dei nomi per indicare quale versione della funzione si desidera chiamare.
Conclusione
Quando i programmatori e gli sviluppatori definiscono e usano la stessa funzione due volte, il sistema viene confuso, portando all'errore tipico di più definizioni di funzioni C ++. Poiché C ++ può mostrare errori e difetti inaspettati in file che sembrano essere corretti, gli sviluppatori godono di un'esperienza dinamica lavorando con esso. Pertanto, questa guida ha spiegato le definizioni multiple di errore di funzioni in C ++, ha fornito la sintassi della soluzione e debug dell'errore.