Jest to bardzo specyficzne i nieco trudne do wytłumaczenia, a całkiem możliwe niemożliwe, ale tutaj idzie.Wykrywanie użycia makra? (errno)
Chcę zaimplementować <errno.h>. (. Mój projekt hobby realizuje standardowe C biblioteki)
naiwny sposób, aby go o to:
// in <errno.h>
extern int errno;
// in some .c file
int errno = 0;
To działa. Ma jednak jedną wadę: jeśli wywoływana jest funkcja biblioteki matematycznej, musi zawsze przesyłać kwerendę do stanu FPU po wykonaniu, aby odpowiednio ustawić errno
. Powoduje to zatrzymanie FPU w ciężkich zastosowaniach matematycznych.
standardzie C popiera leniwe ocenę errno
przez co makro zamiast:
int * __errno();
#define errno *__errno()
ten sposób errno
jest tylko "zestaw", gdy jego wartość jest rzeczywiście wniosek:
// "__errno()" returns the location of the current errno value,
// the "errno" macro turns it into a value.
x = errno;
Biorąc pod uwagę pewną logikę w pozostałej części biblioteki, status FPU wymaga jedynie zapytania, jeśli ostatnia funkcja biblioteki nazywała się przy użyciu FPU, , a wartość errno
jest rzeczywiście wymagana.
Do tej pory wszystko jest w porządku. Ale to jest na odwrót, że daje mi głowy:
errno = 0;
Wartość errno
nie jest wymagane w ogóle. Ale __errno()
nie wie o tym i zapyta o stan FPU, jeśli ostatnia funkcja biblioteki wywołana używała FPU.
Teraz nie widzę sposobu, aby uniknąć sytuacji (czyli mają errno
makro lub funkcji __errno()
jakoś działa różnie w zależności od tego, czy są one wykorzystywane do lewej lub po prawej stronie operatora przypisania) oraz jestem prawie zadowolony, aby to zaakceptować.
Ale może któryś z was ma świetny pomysł?