gpt4 book ai didi

c - 检测宏的使用? (错误号)

转载 作者:太空狗 更新时间:2023-10-29 16:55:58 24 4
gpt4 key购买 nike

这是非常具体的,有点难以解释,而且很可能是不可能的,但是就这样吧。

我想实现 。 (我的爱好项目是实现标准 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() 函数以某种方式工作,具体取决于它们是否用于赋值运算符的左边或右边),我几乎满足于接受这一点。

但也许你们中的任何一个 SO'ers 都有绝妙的主意?

最佳答案

这里没有绝妙的想法,但是 afaik errno 允许通过函数调用来实现,以使标准库的线程安全实现成为可能。我不认为懒惰地查询 FPU 是个好主意:在这种情况下你将如何避免不一致:

  • 设置errno
  • 设置错误标志的浮点操作
  • 获取errno
  • 获取标志

是否应该调用 __errno() 清除标志?

根据标准,errno 是否必须由数学函数设置由 math_errhandling 的值决定(具体来说,math_errhandling & MATH_ERRNO)。

我要做的是通过预处理器指令使错误报告可选,并允许程序员在编译时设置 math_errhandling 的值。这意味着数学函数不能预先静态编译,而必须驻留在 header 中,无论如何,这可能是一个好主意,允许没有链接时优化的编译器内联这些函数。

关于c - 检测宏的使用? (错误号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1347208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com