Domanda

Mentre la compilazione con avr-gcc che ho incontrato errori del linker come il seguente:

undefined reference to `__cxa_pure_virtual'

Ho trovato questo documento in cui si afferma :

  

La funzione __cxa_pure_virtual è un gestore di errori che viene richiamato quando viene chiamata una funzione virtuale pura.

     

Se si sta scrivendo un'applicazione C ++ che ha funzioni virtuali pure è necessario fornire la propria funzione __cxa_pure_virtual gestore degli errori. Ad esempio:

     

extern "C" void __cxa_pure_virtual() { while (1); }

La definizione di questa funzione come correzioni suggerite gli errori, ma mi piacerebbe sapere:

  • quale sia lo scopo di questa funzione è,
  • perché dovrei bisogno di definire me stesso e
  • motivo per cui è accettabile per codificare come un ciclo infinito?
È stato utile?

Soluzione

Se in qualsiasi parte del tempo di esecuzione del programma viene creato un oggetto con un puntatore a funzione virtuale non compilato, e quando viene chiamata la funzione corrispondente, sarà chiamare una 'funzione virtuale pura'.

Il gestore si descrive dovrebbe essere definito nelle librerie predefinite che vengono con l'ambiente di sviluppo. Se vi capita di omettere le librerie predefinite, troverete questo gestore undefined: il linker vede una dichiarazione, ma nessuna definizione. Ecco quando è necessario fornire la propria versione.

Il ciclo infinito è accettabile perché è un errore di 'forte': gli utenti del software immediatamente notarlo. Qualsiasi altra applicazione 'forte' è accettabile, anche.

Altri suggerimenti

1) Qual è lo scopo della funzione __cxa_pure_virtual ()?

funzioni virtuali puri possono ottenere chiamato durante oggetto la costruzione / distruzione. Se ciò accade, __cxa_pure_virtual () viene chiamato per segnalare l'errore. Vedere Dove "pura chiamata di funzione virtuale" crash vengono?

2) Perché potreste necessario definire da soli?

Normalmente questa funzione è fornita da libstdc ++ (per esempio su Linux), ma avr-gcc e la toolchain Arduino non forniscono una libstdc ++.

L'IDE Arduino riesce ad evitare l'errore di linker durante la creazione di alcuni programmi perché si compila con le opzioni "-ffunction sezioni -fdata sezioni" e legami con "-Wl, - GC-sezioni", che scende alcuni riferimenti simboli inutilizzati.

3) Perché è accettabile per codificare __cxa_pure_virtual () come un loop infinito?

Bene, questo è almeno sicuri; si fa qualcosa di prevedibile. Sarebbe più utile per interrompere il programma e segnalare l'errore. Un ciclo infinito sarebbe stato imbarazzante per eseguire il debug, però, a meno che non si dispone di un debugger che può interrompere l'esecuzione e dare un backtrace dello stack.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top