[英]What does 'transmitted' mean in printf function return?
我对标准C库中printf
的返回值和缓冲流的解释感到困惑。
在C99:TC3标准中 ,7.19.6.3 / p3定义printf
函数成功返回非负“ 传输的字符数”。 此外,7.19.3 / p3描述了“ 传输到主机环境或从主机环境传输 ”的完全/线路缓冲流的行为,而p7表示stdout
可以是完全缓冲的流。
引用第7.19.3节,重点是:
7.19.3文件
3当流未缓冲时 ,字符应尽快从源或目标出现。 否则,可以将字符作为块累积并发送到主机环境或从主机环境发送 。 当流被完全缓冲时 ,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输 。 当流被线缓冲时 ,当遇到换行符时 ,字符将作为块传输到主机环境或从主机环境传输 。 此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。 。 对这些特性的支持是实现定义的,可能会受到
setbuf
和setvbuf
函数的影响。7 [...]最初打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲 。
这些定义导致以下行为是合法的。 但这是违反直觉和不可接受的结果(至少对我而言)。
#include <stdio.h>
#include <assert.h>
// PRECONDITION: `stdout` is fully buffered
int main()
{
int n = printf("abc"); // "abc" is accumulated, and no transmission.
assert(n == 0); // so, return value can be equal to 0 ??
}
我的解释错在哪里? 或者它只是“实现定义”行为之一?
printf
和fprintf
的返回值是传输到流的字节数 - 它是主机环境中的对象 - 而不是最终目标。 这些字节何时以及如何通过流传输到文件或设备(“从主机环境传输”)是无关紧要的。 缓冲不会影响流如何从程序接受字节; 是否直到将它们发送到相关文件或设备上时才会保留它们。
“ 传输 ”一词意味着字节穿过某个接口。 我认为7.19.6.3引用的接口是printf
和设备驱动程序之间的接口,而7.19.3引用的接口是设备驱动程序的输出。
此外,我认为你提出的解释会使printf
的返回值变得任意和反复无常。
因此,我得出结论,示例代码中的printf
将始终返回3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.