Sto ricevendo un sacco di "ridefinizione di x .... x precedentemente definito qui". Per favore, cosa significa questo errore?Errore del compilatore GCC: "ridefinizione ... precedentemente definita"
risposta
Probabilmente stai includendo un file di intestazione due volte. Assicurati che i tuoi file di intestazione siano contornati dalle dichiarazioni #ifndef
.
http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html
è necessario limitare ogni file venga incluso solo una volta. Puoi farlo in 2 modi.
1) Nella parte superiore del file di intestazione messo:
#pragma once
o 2) se il compilatore non supporta questo, mettere in cima/fine del file di intestazione:
#ifndef _MYFILE_H_
#define _MYFILE_H_
...
#endif
Sostituisci MYFILE con il nome del file e sostituisci ... con il contenuto del file di intestazione.
L'errore indica che c'è un simbolo che è stato definito in un posto e una definizione alternativa è stata effettuata in un altro luogo.
Ciò può verificarsi se in casi come:
- se definite due funzioni con lo stesso nome
- se v'è una mancata corrispondenza tra una funzione e prototipo
- si chiama un non banale funzione prima che sia stata definita e senza un prototipo
In questo ultimo caso ci sarà una mancata corrispondenza tra la funzione reale e la "dichiarazione implicita" che il compilatore assume s quando non ha un prototipo da usare.
Queste situazioni possono essere evitati:
- Garantire che i prototipi di funzione sono dichiarati solo una volta
- Assicurare che tutte le funzioni hanno nomi unici nel loro ambito (ad esempio all'interno di un file se sono
static
o. Univoco se vengono utilizzati tra file oggetto) - Fare attenzione se si utilizzano le istruzioni
extern
nei file di origine per dichiarare i prototipi. Meglio usare un prototipo dal file di intestazione appropriato. - Verificare che tutte le funzioni abbiano prototipi: all'interno del file di origine nel caso delle funzioni
static
o in un file di intestazione se devono essere utilizzati da altri file oggetto. - garantire che tutti i file di intestazione possono essere inclusi solo una volta per ogni file sorgente, utilizzando uno dei costrutti suggerite da Mehrdad e Brian R. Bondy
Credo che #pragma funziona solo in VC++, non in gcc . Il trucco #define è portatile. – Gorpik
soppresso da gcc e vC++ –
Wikipedia dice che #pragma una volta è supportato da VC++ e gcc http://en.wikipedia.org/wiki/Pragma_once. –