【发布时间】:2015-02-27 03:00:48
【问题描述】:
我对标准 C 库中 printf 的返回值和缓冲流的解释感到困惑。
在C99:TC3 Standard 中,7.19.6.3/p3 定义printf 函数成功返回非负数“传输的字符数”。
此外,7.19.3/p3 描述了“transmitted to or from the host environment”的全/行缓冲流的行为,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 ??
}
我的解释有什么错误? 还是只是“实现定义的”行为之一?
【问题讨论】:
标签: c language-lawyer