考虑以下代码中,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
会被设置为其他内容吗?还是说errno
已经被复制到printf()
的激活记录中,甚至在评估strerror()
之前就已经保持不变了?这是未指定的行为吗?
编辑:
是的,我确实明白我可以在fopen()
之后立即将errno
保存到某个int
中,但这不是我的重点。我试图弄清楚上面的代码段如何运行。
strerror()
函数不会设置errno
。但这是一个好问题。一个安全的方法是先捕获int errnum = errno;
,然后使用errnum
。 - Jonathan Lefflerstrerror()
函数将返回指向生成的消息字符串的指针。如果出现错误,可能会设置errno
值,但没有保留任何返回值来指示错误。不确定这是否在标准中,还是只在POSIX中存在。 - Ted Lyngmoerrno
值打印为用户将放入错误报告中的消息文本的校验和。这根本不是“线路噪声”。 - Andrew Henle