C语言中能否将多个错误退出函数合并到单条语句中?
问题分析与解决方案
编译错误原因
你尝试用&&合并两个void类型的函数调用,这在C语言里是不允许的。&&逻辑运算符要求左右操作数是能被评估为布尔值的表达式(即有返回值),但closeFile和exitErr都是void返回类型,没有返回值,所以编译器报错void value not ignored as it ought to be。
现有函数行为梳理
closeFile:尝试关闭传入的文件描述符,若任一关闭失败,打印对应错误并以退出码100终止程序;若全部关闭成功,函数正常返回,不终止程序。exitErr:打印指定错误信息后,以传入的退出码终止程序。
满足需求的正确写法
你的需求是读写错误时先尝试关闭文件,打印所有相关错误信息,直接拆分两个函数调用即可,不需要用逻辑运算符合并:
if (wr < 0) { closeFile(opf1, opf2); exitErr("Error: Can't write to %s\n", NULL, argv[2], 99); }
这段代码的执行逻辑完全符合你的需求:
- 先调用
closeFile关闭文件:如果关闭失败,它会打印关闭错误并直接退出(退出码100),后续的exitErr不会执行; - 如果所有文件都成功关闭,
closeFile执行完毕后,会继续调用exitErr打印读写错误信息,然后以退出码99终止程序。
额外优化提示(可选)
你的exitErr函数存在逻辑瑕疵:当file1和file2同时不为NULL时,前三个if都不触发,会执行else分支,但如果传入的格式化字符串str没有两个占位符,dprintf会出现未定义行为。可以调整逻辑为:
void exitErr(char *str, char *file1, char *file2, int ext_val) { if (file1 != NULL && file2 != NULL) dprintf(STDERR_FILENO, str, file1, file2); else if (file1 != NULL) dprintf(STDERR_FILENO, str, file1); else if (file2 != NULL) dprintf(STDERR_FILENO, str, file2); else dprintf(STDERR_FILENO, str); exit(ext_val); }
这样的分支判断更清晰,避免重复执行或逻辑覆盖问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

