繁体   English   中英

'print'在printf函数返回时意味着什么?

[英]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当流未缓冲时 ,字符应尽快从源或目标出现。 否则,可以将字符作为块累积并发送到主机环境或从主机环境发送 当流被完全缓冲时 ,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输 当流被线缓冲时 ,当遇到换行符时 ,字符将作为块传输到主机环境或从主机环境传输 此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要从主机环境传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。 。 对这些特性的支持是实现定义的,可能会受到setbufsetvbuf函数的影响。

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 ??
}

我的解释错在哪里? 或者它只是“实现定义”行为之一?

printffprintf的返回值是传输到流的字节数 - 它是主机环境中的对象 - 而不是最终目标。 这些字节何时以及如何通过流传输到文件或设备(“从主机环境传输”)是无关紧要的。 缓冲不会影响流如何从程序接受字节; 是否直到将它们发送到相关文件或设备上时才会保留它们。

传输 ”一词意味着字节穿过某个接口。 我认为7.19.6.3引用的接口是printf和设备驱动程序之间的接口,而7.19.3引用的接口是设备驱动程序的输出。

此外,我认为你提出的解释会使printf的返回值变得任意和反复无常。

因此,我得出结论,示例代码中的printf将始终返回3。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM