Provengo da uno sfondo C#, ma sto imparando C al momento. In C#, quando si vuole segnalare che si è verificato un errore, si genera un'eccezione. Ma cosa fai in C?C: Come si simula un'eccezione?
Ad esempio, si dispone di uno stack con le funzioni push
e pop
. Qual è il modo migliore per segnalare che lo stack è vuoto durante un pop
? Cosa ritorna da quella funzione?
double pop(void)
{
if(sp > 0)
return val[--sp];
else {
printf("error: stack empty\n");
return 0.0;
}
}
s' esempio dalla pagina 77 (codice di cui sopra) K&R restituisce un 0.0
. Ma cosa succede se l'utente ha spinto uno 0.0
in precedenza nello stack, come fai a sapere se lo stack è vuoto o se è stato restituito un valore corretto?
Non sono d'accordo, in qualche modo, perché anche se capisco cosa intendi, non darei a nessuno che provenga da java/C# land l'ipotesi che setjmp/longjmp sia in qualche modo la "soluzione" a "dov'è la mia eccezione?" – Jonke
Si noti che pochissimo codice C usa setjmp/longjmp per ragioni storiche. I codici di errore sono il solito modo C. I codici di errore non sono molto buoni; la mancanza di Eccezioni in C è una delle ragioni principali per cui le lingue più moderne sono migliori. – Nelson
ANSI ha codificato 'setjmp ', quindi è garantito che funzioni (almeno se il compilatore è conforme allo standard), ma lo switch dello stack e la concorrenza hanno non sono stati standardizzati, quindi è ancora un problema scrivere un pacchetto sicuro per C (anche usando asm per fare l'interruttore di contesto) perché un compilatore * potrebbe * (anche se potrebbe essere improbabile) eseguire ottimizzazioni e trasforma che interrompono le ipotesi nel pacchetto di thread. – Jonke