11301
题目
分别给出一个例子,说明“应该用 assert”与“应该用返回值 + errno”的区别;并解释原因。
答案
适合用 assert 的情况:
c
int divide_checked(int a, int b) {
assert(b != 0);
return a / b;
}1
2
3
4
2
3
4
如果这个函数的调用约定已经明确要求 b != 0,那么传入 0 是调用方破坏前提,适合在调试阶段尽早暴露。
适合用返回值加 errno 的情况:
c
FILE* fp = fopen("data.txt", "r");
if (fp == NULL) {
perror("fopen");
}1
2
3
4
2
3
4
文件不存在、权限不足等情况来自外部环境,程序应把它当作可恢复错误处理,而不是用 assert 中止。