You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

这段代码的执行逻辑完全符合你的需求:

  1. 先调用closeFile关闭文件:如果关闭失败,它会打印关闭错误并直接退出(退出码100),后续的exitErr不会执行;
  2. 如果所有文件都成功关闭,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:09:21