Questo è molto specifico, e un po 'difficile da spiegare, e molto probabilmente impossibile, ma qui va.Rileva l'utilizzo della macro? (errno)
Voglio implementare errno.h >. (. Il mio progetto hobby sta attuando un libreria standard C)
Il modo ingenuo per andare a questo proposito è:
// in <errno.h>
extern int errno;
// in some .c file
int errno = 0;
Questo funziona. Ma ha uno svantaggio: se viene chiamata una funzione di libreria matematica, è sempre deve interrogare lo stato dell'unità FPU dopo l'esecuzione per impostare errno
come appropriato. Ciò blocca la FPU in applicazioni matematiche.
Il C norma appoggia valutazione pigra di errno
rendendolo una macro invece:
int * __errno();
#define errno *__errno()
questo modo, errno
è solo "set" quando il suo valore è effettivamente richiesto:
// "__errno()" returns the location of the current errno value,
// the "errno" macro turns it into a value.
x = errno;
Dato un po 'di logica nel resto della libreria, lo stato della FPU deve essere interrogato solo se l'ultima funzione della libreria chiamata era in realtà uno utilizzando FPU, e il valore di errno
è attualmente richiesto.
Finora tutto è a posto. Ma è il contrario che mi sta dando il mal di testa:
errno = 0;
Il valore di errno
non è richiesto a tutti. Ma lo __errno()
non lo sa e interrogherà lo stato della FPU se l'ultima funzione della libreria chiamata stava utilizzando la FPU.
In questo momento non vedo un modo per evitare che (vale a dire, hanno la macro errno
o la funzione __errno()
in qualche modo funzionare in modo diverso a seconda che essi sono utilizzati per la sinistra o la destra dell'operatore di assegnazione), e sono quasi contento di accettare questo.
Ma forse qualcuno di voi SO'ers ha un'idea geniale?