簡體   English   中英

用C語言定義函數printf

[英]definition of function printf in C language

我已經讀過C語言不包含用於輸入和輸出的指令,並且printf,scanf,getchar和putchar實際上是函數。

那么,獲得功能printf的原始C語言指令是哪些? 謝謝。

如果要使用printf ,則必須#include <stdio.h> 該文件聲明了該功能。

如果您在考慮如何實現printf:printf可能會在內部調用任何其他函數,並且可能會進入putc (也是C運行時的一部分)來逐個寫出字符。 最終,其中一個功能需要真正將字符寫入控制台。 如何完成此操作取決於操作系統。 例如,在Linux上, printf可能會在內部調用Linux write函數。 在Windows上, printf可能在內部調用WriteConsole

函數printf記錄在這里 實際上,它不是C語言本身的一部分。 語言本身不提供輸入和輸出的手段。 函數printf在庫中定義,可以使用編譯器指令#include <stdio.h>進行訪問。

沒有一種編程語言為I / O提供真正的“基元”。 任何I / O“原語”都依賴於較低的抽象級別,無論是這種語言還是另一種語言。

最低級別的I / O需要訪問硬件。 您可能正在查看BIOS中斷,硬件I / O端口,內存映射的設備控制程序或其他所有內容,具體取決於程序所運行的實際硬件。

由於在編程語言的實現中滿足所有這些可能性將是一個真正的負擔,因此采用了硬件抽象層 各個I / O控制器由硬件驅動程序訪問,而硬件驅動程序又由操作系統控制,操作系統通過定義的抽象API向應用程序開發人員提供I / O服務。 這些可以直接訪問(例如,通過用戶空間組裝),也可以進一步包裝(例如,通過編程語言的解釋器或標准庫函數的實現)。

無論您正在查看的是“ bash” echo或“ Python” print類的“命令”,還是諸如(Java) System.out.println()或(C) printf()或(C ++) std::cout類的庫函數,只是一個語法上的細節:任何I / O都要經歷幾層抽象,因為它更容易,並且因為它可以保護您免受各種錯誤或惡意程序行為的侵害。

這些相應語言的“原始語”。 如果您要進一步研究,您將離開該語言的領域,並進入其實現的領域。


我曾經親自進行過C庫實現。 此后,該項目的所有權就已經轉移了 ,但是基本上它是這樣工作的:

  • printf()是通過printf()實現的vfprintf()最終, *printf()系列的每個函數也是如此)。
  • vfprintf()使用了幾個內部助手來進行精美的格式化,並將其寫入緩沖區。
  • 如果需要刷新緩沖區,則將其傳遞給內部writef()函數。
  • 對於每個目標系統,都需要以不同的方式實現該writef()函數。 在POSIX上,它將調用write() 在Win32上,它將調用WriteFile() 等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM