【发布时间】:2009-08-28 14:03:28
【问题描述】:
这是非常具体的,有点难以解释,而且很可能是不可能的,但这里就是这样。
我想实现
天真的方法是:
// 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,和errno 的值,则只需要查询FPU 状态实际上是请求。
到目前为止,一切都很好。但恰恰相反,这让我很头疼:
errno = 0;
根本不请求errno 的值。 但__errno() 不知道,如果最后调用的库函数正在使用 FPU,则会查询 FPU 状态。
现在我看不到避免这种情况的方法(即,errno 宏或 __errno() 函数的工作方式不同,具体取决于它们是用于赋值运算符的左侧还是右侧) ,并且几乎满足于接受这一点。
但也许你们中的任何人都有一个绝妙的主意?
【问题讨论】:
标签: c macros c-preprocessor