簡體   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