c - C 标准库中的任何函数是否隐式使用`stderr`?
问题描述
C 规范要求所有 C 程序都有 3 个开放的流可供它们使用:stdout
、stdin
、stderr
.
用户可以根据需要使用这些流,例如:
fprintf(stdout, "lol");
fputs("oops", stderr);
fgets(buffer, 20, stdin);
C 标准库中的一些函数隐式使用这些函数,例如:
printf("lol"); /* implicitly uses stdout */
puts("rofl"); /* implicitly uses stdout */
int c = getchar(buffer); /* implicitly uses stdin */
- C 标准库中的任何函数是否隐式使用
stderr
? - C 标准库的常见实现中的任何
stderr
函数(例如 Linux 上的 GNU 的 glibc)是否隐式使用?
解决方案
assert
宏和函数perror
写入标准错误流。该abort_handler_s
功能也是如此(在可选附件 K 中)。
exit
关闭文件并刷新流,因此它隐式地作用于标准错误流。_Exit
并且abort
可以这样做;C 标准允许但不要求这样做。fflush(NULL)
刷新所有流。
C 2018 7.21.3 3 描述了输入和输出流之间的一些交互:在非缓冲流或行缓冲流上请求输入,并且需要来自主机环境的字符,然后刷新行缓冲流。这可能会影响标准错误流。
根据可选的 C 2018 附录 J,C 实现可能会将一些浮点诊断写入标准错误流,作为正常程序终止的一部分。
在 C 2018 标准中搜索“标准错误流”和“stderr”并没有揭示标准库中标准错误流的任何其他隐式使用。
推荐阅读
- python - Python中是否有任何快捷方式可以删除文件中每行末尾的所有空格?
- javascript - 如何将数组方法应用于在 javascript 中组成二维数组的单个数组?
- amazon-s3 - 使用 aws 客户端时是否需要重试 S3 500 内部错误?
- macos - mac 10.15 上的“pip install os-sys”问题
- javascript - 为什么我的状态挂钩值与我在 useEffect 中记录的值不同?
- buildfire - BuildFire:推送通知测试
- python - 与 pandas 相比,Dask 没有正确分组/应用结果
- ibm-cloud-infrastructure - IBMCloud Classic-Infrastructure EventAPI 在哪里?
- momentjs - 从日期时间字符串和偏移量创建时刻 js 对象
- c# - 构建json响应的更简单方法?