gpt4 book ai didi

c - 关于 errno 和 strerror()

转载 作者:行者123 更新时间:2023-12-05 01:22:57 27 4
gpt4 key购买 nike

考虑到 fopen() 失败,在下面的代码中:

FILE *fp = fopen("file.txt", "w");
if (fp == NULL) {
printf("Error occurred while opening file, errno=%d, %s\n",
errno, strerror(errno));
exit(1);
}

由于在 C 中未指定函数参数的求值顺序,因此在调用 printf() 时,如果首先求值(调用)strerror()它失败了,不会 errno be set当该行实际打印出来时会变成别的东西吗?或者,是否 errno 甚至在评估 strerror() 之前就已被复制到 printf() 的激活记录中,因此将保持不变?这是未指明的行为吗?

编辑:是的,我明白我可以在 fopen() 之后将 errno 保存到一些 int 中,但这不是我的意思。我想弄清楚上面这段代码的行为方式。

最佳答案

Since no return value is reserved to indicate an error, an application wishing to check for error situations should set errno to 0, then call strerror(), then check errno.

来自您使用的同一篇文章。很可能是未指定的行为。 MAN 说同样的话

POSIX.1-2001 and POSIX.1-2008 require that a successful call tostrerror() or strerror_l() shall leave errno unchanged, and notethat, since no function return value is reserved to indicate anerror, an application that wishes to check for errors shouldinitialize errno to zero before the call, and then check errnoafter the call.

所以可以保存fopenerrno,然后得到strerrorerrno。或者简单地使用 perror

关于c - 关于 errno 和 strerror(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73167084/

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