我正在看一段C代码
void printerror(char *message)
{
printf ("There was an error: '%s'\n", message);
switch (errno) {
... do stuff depending on errno
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这可能是一个问题,因为printf可能会在进入函数和到达函数之间改变错误switch
.但是,printf的联机帮助页没有说出设置errno的任何内容,所以我可以假设它不会设置它吗?标准中是否有任何内容可以保证哪些函数将使用和不使用errno?
小智 10
任何函数都可以设置errno,但前提是它将其设置为非零值.ANSI C规范声明:
程序启动时errno的值为零,但任何库函数都不会将其设置为零.*如果使用errno,则errno的值可以通过库函数调用设置为非零值,无论是否存在错误.未在标准中的功能描述中记录.
*因此,使用errno进行错误检查的程序应在库函数调用之前将其设置为零,然后在后续库函数调用之前检查它.
因此,如果您使用的是errno,最佳实践方法是在库调用之前立即将值设置为0,可能会失败并立即读取它.在上面的情况下,添加类似的东西就足够了:
int localErrno = errno
紧接在printf语句之前,并使用localErrno作为您的开关.当然,这假设在失败的函数和对printerror的调用之间没有库调用.如果有,您需要在失败的调用后存储errno并将其传递给您的printerror函数.