是否要避免连续调用`errno`?

Sta*_*ked 8 c

errno处理相同错误时多次调用是否安全.或者使用本地副本更安全?

这个例子说明了我的问题:

// If recvfrom() fails it returns -1 and sets errno to indicate the error.
int res = recvfrom(...);
if (res < 0)
{
    // Risky?
    printf("Error code: %d. Error message: %s\n", errno, strerror(errno));

    // Safer alternative?
    int errorNumber = errno;
    printf("Error code: %d. Error message: %s\n", errorNumber, strerror(errorNumber));
}
Run Code Online (Sandbox Code Playgroud)

Hab*_*bie 5

errno的值只能在调用明确声明为其设置的函数之后定义,并且直到它被下一个函数调用更改或者应用程序为其赋值.

http://www.opengroup.org/onlinepubs/009695399/functions/errno.html

但是,strerror理论上甚至可以将其视为可以改变它的函数调用(请参阅schot的注释),因此理论上,您应该使用保存优先形式.

  • 令人难以置信的是,`strerror`被指定在某些条件下写入`errno`:http://www.opengroup.org/onlinepubs/9699919799/functions/strerror.html具有讽刺意味的是,测试`strerror`失败的唯一方法是通过在调用`strerror`之前将`errno`设置为0,因为返回值不反映成功或失败.所以OP可能会出现在... (4认同)
  • 但是对“strerror”的调用可能会改变“errno”。尽管我不认为有任何愚蠢/邪恶的实现可以做到这一点。(DeathStation 9000 除外)。 (2认同)
  • 据我所知,C标准允许任何库函数以完全未指定的方式更新`errno`,除非明确指定不执行该函数,因此如果我们不讨论POSIX,则问题更加相关. (2认同)