2010-07-05 18 views
9

Ho codice C++ che utilizza alcune librerie C. Le librerie C accettano callback in linguaggio C. Ho scritto un callback nel mio codice C++ e ora ho in qualche modo bisogno di riportare un errore da esso (ma restituisce vuoto). Mi chiedo se posso lanciare un'eccezione da un callback C che viene utilizzato dal codice C++?Posso lanciare eccezioni C++ dai callback legacy C?

Questo è molto difficile per me capire.

Grazie, Boda Cydo.

risposta

9

Sì, dovresti essere in grado di farlo. Tuttavia, tieni presente che è molto probabile che la libreria C non sia stata scritta in modo da garantire un'eccezione e, di conseguenza, potresti lasciare alcune delle strutture di quella libreria in uno stato incoerente. Dipende interamente dalla libreria specifica e dalla specifica funzione di callback. Se non altro, quella libreria dovrebbe probabilmente essere scritta con il supporto C++ in mente dall'inizio rispetto a quella richiamata.

+1

+1 punto buono, la libreria C può allocare memoria, aprire un file o una connessione di rete prima di chiamare la funzione di callback. Se si lancia un'eccezione lì, la libreria non viene chiarita in seguito. – Ozan

+0

Grazie per i suggerimenti. Ho fatto usare una variabile globale che viene impostata se si è verificato un errore. Tutte le chiamate successive a questa funzione di callback in C quindi tornano e non fanno nulla. Dopo che la libreria ha finito con tutte le chiamate C, e torno al mio codice C++, controllo se questa variabile globale è stata impostata, e se lo era, riporto un errore. – bodacydo

+2

Le tue prime due affermazioni sono mutuamente contraddittorie. "Sì, dovresti essere in grado di farlo." - Ok bene. "Tuttavia, tieni presente che è molto probabile che la libreria C non sia stata scritta per essere eccezionalmente sicura" - Oh, quindi la risposta in realtà non è allora. Non generare mai eccezioni attraverso codice che non è noto per essere eccezionalmente sicuro. – JeremyP

1

Sì, è possibile generare un'eccezione dalla funzione C++. Tuttavia, può essere catturato solo dal codice C++, quindi non verrà gestito nella libreria legacy.

+0

Intendevi dire "dalla tua funzione C"? – egrunin

+0

No. Se si genera un'eccezione, la funzione non è C, vero? – Anthony

+0

Buon punto. È callback C o callback C++ se lancio da esso? – bodacydo