我在看一段 C 代码,它是沿着

void printerror(char *message)
{
    printf ("There was an error: '%s'\n", message);
    switch (errno) {
       ... do stuff depending on errno
    }
}

我认为这可能是一个问题,因为 printf 可能会在进入函数和到达 switch 之间更改 errno 。但是,printf 的联机帮助页没有说明它设置 errno,所以我可以假设它永远不会设置它吗?标准中是否有任何内容可以保证哪些函数将使用和不使用 errno?

最佳答案

任何函数都可以设置 errno,但前提是它将其设置为非零值。 ANSI C 规范指出:



因此,如果您使用 errno,最佳实践方法是在可能失败的库调用之前立即将值设置为 0,然后立即读取它。在上述情况下,添加以下内容就足够了:



紧接在 printf 语句之前,并使用 localErrno 作为您的开关。当然,这假设在失败的函数和您对 printerror 的调用之间没有库调用。如果有,您需要在调用失败后存储 errno 并将其传递给您的 printerror 函数。

关于我可以假设 C stdlib 函数不使用 errno 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4391026/

10-13 06:40