Vengo de un fondo de C#, pero estoy aprendiendo C por el momento. En C#, cuando uno quiere indicar que ha ocurrido un error, lanza una excepción. ¿Pero qué haces en C?C: ¿Cómo se simula una 'excepción'?
Digamos por ejemplo que tiene una pila con las funciones push
y pop
. ¿Cuál es la mejor manera de indicar que la pila está vacía durante un pop
? ¿Qué devuelves de esa función?
double pop(void)
{
if(sp > 0)
return val[--sp];
else {
printf("error: stack empty\n");
return 0.0;
}
}
K&R 's ejemplo de la página 77 (el código de) devuelve un 0.0
. Pero, ¿qué sucede si el usuario presionó 0.0
anteriormente en la pila, cómo sabe si la pila está vacía o si se devolvió un valor correcto?
No estoy de acuerdo, de alguna manera, porque incluso si entiendo lo que quieres decir, no daría a alguien que venga de java/C# land la suposición de que setjmp/longjmp es de alguna manera la 'solución' a '¿dónde está mi excepción?' – Jonke
Tenga en cuenta que muy poco código C usa setjmp/longjmp por razones históricas. Los códigos de error son la forma C habitual. Los códigos de error no son muy buenos; la falta de Excepciones en C es una de las principales razones por las que los idiomas más modernos son mejores. – Nelson
ANSI ha codificado 'setjmp 'por lo que está garantizado que funciona (al menos si el compilador cumple con el estándar), pero el cambio de pila y la concurrencia no tienen estandarizado , por lo que sigue siendo un problema escribir un paquete de hilos para C (incluso usando asm para hacer el cambio de contexto) porque un compilador * podría * (aunque podría ser improbable) realizar optimizaciones y transformar que rompen suposiciones en el paquete de subprocesos. – Jonke