Visto che siamo in tema vorrei mostrare come in C sia possibile implementare un rudimentale sistema throw-catch tipico delle eccezioni del C++.

guardate questo code:

codice:
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>

jmp_buf env;

int takecent(int i)
{

	if ((i * i) != 100)
		longjmp(env, 1);	/* equivale al throw */
	return i;
}

void control()
{
	int var = 10;
	
	if (!setjmp(env))
	{
		var = takecent(var);
		printf("Il risultato e' corretto, ed e': %d\n", var);
	}
	else	/* equivale al meccanismo try-catch */
	{
		fprintf(stderr, "Error n.1\t%s:%d\n", __FILE__, __LINE__);
		exit(EXIT_FAILURE);
	}

}


int main()
{
	control();
	return 0;
}
Solitamente il sistema setjmp/longjmp e' utilizzato per gestire delle situazioni intricate (in C). In pratica se ci troviamo in una funzione possiamo salvare lo stato dello stack e richiamarlo da un'altra funzione se necessario ripartendo dalla situazione salvata. L'importante e' che la funzione chiamante (quella con il setjmp) non ritorni prima del longjmp. Ora longjmp fa lo stesso lavoro di throw, ovvero srotola lo stack per trovare il punto in cui 'impiantarsi' facendo un raffronto con la var di tipo jmp_buf. Penso sia automatico pensare alla corrispondenza longjmp -> throw. Se qualcosa non e' chiaro fate sapere.

Bye