Это очень специфично, и немного сложно объяснить, и, скорее всего, невозможно, но здесь идет речь.
Я хочу реализовать . (Мой хобби-проект - реализация библиотеки Standard C .)
Наивный способ сделать это:
// in <errno.h>
extern int errno;
// in some .c file
int errno = 0;
Это работает. Но у этого есть один недостаток: если вызывается функция математической библиотеки, она всегда должна запросить состояние FPU после выполнения, чтобы установить errno
в зависимости от ситуации. Это останавливает FPU в математических приложениях.
Стандарт C поддерживает ленивую оценку errno
, сделав вместо этого макрос:
int * __errno();
#define errno *__errno()
Таким образом, errno
устанавливается только тогда, когда его значение фактически запрашивается:
// "__errno()" returns the location of the current errno value,
// the "errno" macro turns it into a value.
x = errno;
Учитывая некоторую логику в остальной части библиотеки, статус FPU необходимо запрашивать только в том случае, если последняя вызванная библиотечная функция была на самом деле , используя FPU, и значение errno
равно фактически запрашивается .
Пока все хорошо. Но наоборот, у меня болит голова:
errno = 0;
Значение errno
не запрашивается вообще. Но __errno()
этого не знает и запросит состояние FPU, если последняя вызванная библиотечная функция использовала FPU.
Прямо сейчас я не вижу способа избежать этого (т. Е. Чтобы макрос errno
или функция __errno()
как-то работали по-разному в зависимости от того, используются они слева или справа от оператора присваивания) и я почти согласен принять это.
Но, возможно, у кого-то из вас есть блестящая идея?