簡體   English   中英

stdio.h是一個庫嗎?

[英]Is stdio.h a library?

C編程語言stdio.h稱為庫。 但是,我被告知這是一個僅適用於編譯器的頭文件 ,這是真的,因此它不是庫。

互聯網上的其他節目網站稱它為圖書館。 現在的定義有所不同嗎?

一些C程序以#include <stdio.h>開頭,因為C語言不包含文件操作函數。

更新引用來自Brian Kernighan和Dennis Ritchie的C編程語言,第二版,第3頁(簡介):

標准的第二個重要貢獻[指“ANSI標准,或”ANSI C“,1988年完成]是伴隨C的庫的定義。它指定了訪問操作系統的功能(例如讀寫)文件),格式化輸入和輸出,內存分配,字符串操作等...使用此庫與主機系統交互的程序可確保兼容行為。大多數庫都是以“標准I”為基礎建模的UNIX系統的/ O庫。這個庫在第一版中有描述......

圖書館的定義已經發展/改變/更新似乎是一個合乎邏輯的結論......

不, stdio.h不是庫,它是頭文件。 接近C時常見的錯誤是將每個頭文件稱為庫,這是錯誤的。

C標准庫是函數的集合,它們在頭文件中聲明,而stdio.h就是其中之一。 該名稱代表“標准輸入輸出”,因此在該文件中,您可以找到處理輸入,輸出和文件的所有函數聲明。 您可以在此處找到C標准庫中包含的頭文件列表。

庫是一個已編譯的二進制文件 (或者通常是二進制文件的集合),在編譯程序時可以鏈接它以利用庫提供的功能(即導出)。 然后使用頭文件來標識這些函數的名稱和簽名,以便編譯器知道如何調用它們。

通常,對於小型庫,單個頭文件就足夠了,因此初學者很容易將頭文件與庫本身混淆。 然而,C標准庫非常復雜並且具有許多功能,因此它們在不同的頭文件中聲明。

C程序以#include <stdio.h>開頭,因為C語言不包含文件操作函數。

恩,那就對了。 C規范僅涉及語言本身(語法,類型等),並未定義任何“標准”函數。

我的書“C編程語言”稱為stdio.ha庫。 現在,我被告知它是一個僅用於編譯器的“頭文件”,這是真的,因此它不是一個庫。

我有一本書的副本(第一版,也是ANSI版),我不記得有任何關於頭文件和庫之間的區別的混淆。 你能指點我們到你看的地方嗎? 例如,在頁152上,我看到:

引用輸入/輸出庫函數的每個源文件都必須包含該行
#include <stdio.h>

這是真的......這並不是說stdio.h 是一個庫,而是如果你想使用這個庫你必須包含頭文件。 同樣在第176頁:

描述文件的數據結構包含在中,必須在使用標准輸入/輸出庫中的例程的任何源文件中包含(通過#include)。 該庫中的功能也包含它...

在本段中,庫指的是“標准輸入/輸出庫”,而不是stdio.h本身。 我可以看到有人可能會誤解這一點,但在上下文中,本書並沒有將stdio.h稱為庫。

如果您能指出我們正在研究的特定段落,也許我們可以更好地解釋。


更新:

你從這本書中引用的段落來自第二版的介紹,它正在談論到目前為止的語言歷史(第二版於1988年出版)。 特別是,該段落談的是C標准庫:

該標准的第二個重要貢獻是伴隨C的庫的定義......

看起來激發你的問題的部分是這樣的:

...大多數庫都是在UNIX系統的“標准1/0庫”上建模的。 該庫在第一版中有描述,並已廣泛用於其他系統......

在所有情況下,當文本說庫時,它實際上意味着,而不是頭文件 每個C庫都有一個或多個相關的頭文件,它們提供相關庫的接口; 沒有標題,您(和您的編譯器)將不知道如何訪問庫中定義的函數。 例如, fopen()函數在聲明 stdio.h具有一個函數原型:

FILE *
fopen(const char * restrict path, const char * restrict mode);

一旦你有了fopen()的聲明,編譯器就知道如何生成調用該函數的指令,鏈接器會將你的代碼連接到庫文件本身的實際函數定義 因此,當文本說標准I / O庫時 ,它實際上是在討論庫,而同名的頭文件只是一個允許您訪問庫的輔助文件。

圖書館的定義已經發展/改變/更新似乎是一個合乎邏輯的結論......

不,那不是發生了什么事; 頭文件和庫是並且一直是不同但相關的東西,並且自書寫之后,其含義確實沒有改變,至少對於C.

暫無
暫無

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

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