printf()/puts()调用失败后能否恢复?退出前用fprintf(stderr)是否有用?
关于Brainfuck转译器中printf/puts调用失败的疑问与解答
我在实现Brainfuck解释器与转译器时,通过一系列printf()/puts()调用生成目标代码,核心逻辑代码如下:
while (ip < ops->count) { Op op = ops->items[ip]; switch (op.kind) { case '+': printf(" t.mem[t.head] += %zu;\n", op.operand); ++ip; break; case '-': printf(" t.mem[t.head] -= %zu;\n", op.operand); ++ip; break; case '.': printf(" xputchar_many(&t, %zu);\n", op.operand); ++ip; break; case ',': printf(" xgetchar_many(&t, %zu);{\n", op.operand); ++ip; break; case '>': printf(" t.head += %zu;\n\n" " grow_tape_and_append_many_zeroes(&t);\n", op.operand); ++ip; break; case '<': printf(" t.head = t.head < %zu ? t.count - (%zu - t.head) : t.head - %zu;\n", op.operand, op.operand, op.operand); ++ip; break; case '[': puts(" while (t.mem[t.head] != 0) {"); ++ip; break; case ']': puts(" }"); ++ip; break; } }
针对这段代码,我有两个技术疑问:
- 当
printf()调用失败(返回负整数)或puts()调用失败(返回EOF)后,是否存在恢复的可能? - 如果无法恢复,退出前调用
fprintf(stderr, ...)输出错误信息是否仍有意义?
解答
是否可以恢复:确实没有实用的恢复可能。这类输出失败通常源于标准输出流(stdout)出现严重问题,比如管道被关闭、磁盘空间耗尽、输出设备断开等。此时流的状态已处于错误或结束状态,即便调用
clearerr(stdout)清除错误标志,后续输出操作大概率仍会失败,且已生成的目标代码不完整,无法保证正确性,继续执行只会生成残缺的无效代码,没有实际价值。输出错误信息是否有意义:非常有意义。虽然程序无法完成转译任务,但向标准错误流(stderr)输出明确的错误信息(如"输出失败:磁盘空间不足""无法写入标准输出"),能让用户清晰知晓问题根源,而非困惑于程序无征兆退出或得到残缺输出。stderr默认无缓冲,且与stdout是独立流,即便stdout故障,stderr大概率仍能正常输出,帮助用户排查问题。
内容的提问来源于stack exchange,提问作者Madagascar
相关产品推荐
相关产品推荐

