2009-11-22 8 views

risposta

2

Bene, non si può davvero implementare le eccezioni in C poiché non sono supportate dalla lingua. Il meglio che puoi fare è emulare emulare usando setjmp e longjmp e alcune macro diabolicamente intelligenti.

Una rapida ricerca salta fuori questi collegamenti che possono essere utili a voi:

+0

Sto cercando un'implementazione avanzata e sì è possibile implementarle in C. Solo che la sintassi non è semplice. Per quanto riguarda nidificazione e messaggi, sono anche possibili. La tua risposta non è davvero una risposta, assumendo che non ho cercato su Google prima di postare questo, per non parlare di avere qualche giorno prima di questo, è solo pura reputazione prostituta. -1 – nubela

+0

di pensiero * (limitazione di 15 caratteri) – nubela

+0

@Daniel È possibile implementare tutto in C, solo perché C è una sorta di assemblatore portatile in modo che tutto ciò che può essere eseguito sul computer possa essere implementato utilizzando C. C manca di zucchero sintattico per molte cose , come OOP ed eccezione, ma ci sono modi per aggirarlo. Ricorda: il primo compilatore C++ (Cfront) produceva codice C semplice. – qrdl

3

per la nidificazione: uno stack-frame di blocchi try/catch attuali.

Il tuo tentativo userà setjmp per salvare su un jmpbuffer (credo). Se hai fatto una prova, e quindi sei ora nel campo di applicazione di un blocco try e fai un altro tentativo, allora vuoi preservare il jmpbuffer esistente e anche crearne uno nuovo - Push - e quando vieni catturato stai riprendendo a il punto della prova più recente da qui ti piace l'ultimo jmpbuffer. Quindi penso che un modello tipo stack abbia senso per try/catch annidati.

Per l'implementazione, suppongo che il più semplice apporach sia quello di riservare un array di jmpbuffer, limitando quindi la profondità del try-catch, ma mantenendolo semplice; Push e Pop richiedono semplicemente di tenere traccia dell'indice in quella matrice.

Per i messaggi e altri contenuti di eccezione, un'area riservata per "currentException".

Contenuto eccezione. Mantengalo semplice, definisca una struttura di eccezione. Un array di caratteri e un int. Mantenendolo semplice, ma non troppo semplice, riservane una serie in modo da poter supportare il concatenamento.

per una rimessa si consente

throw ("string", errcode) 

Quali azzera semplicemente la struttura a matrice e fa una voce. E

catch (exception) 

Ora può guardare nella matrice e trova la prima voce, e poi

throwChain ("string", errcode) 

che aggiunge la nuova eccezione alla matrice (se c'è spazio, e se non può mescolare l'array secondo alcune regole come FIFO)

Ma, devo chiedere, perché non usare solo C++?

+0

Interessante, cura di elaborare? In realtà sto esplorando per implementare un compilatore di giocattoli in C. Quindi yeap. – nubela

+0

Aggiungerò un po 'di più, ma mi sto solo inventando l'impulso del momento :-( – djna

+0

Please do ty :) – nubela

4

Dave Hanson ha già fatto un really nice package of exception macros come parte del suo eccellente libro C Interfaces and Implementations. Potresti usare il codice all'ingrosso o imparare dalle sue tecniche. Per chi fa una buona quantità di programmazione C, il libro vale la pena acquistare — cambierà il modo in cui cambi la programmazione C   e ti mostrerà come eseguire la progettazione orientata agli oggetti in   C.

Problemi correlati