我想知道C中的預處理器指令和庫之間有什麼區別?預處理器指令和庫之間的區別
到目前爲止,我知道預處理指令用於包含外部文件。 (我的意思是這些外部文件可以是庫?)
並且庫已經爲我們編寫了編譯好的程序。 (因此,我們需要預處理器指令將它們包含在C?)
我想知道C中的預處理器指令和庫之間有什麼區別?預處理器指令和庫之間的區別
到目前爲止,我知道預處理指令用於包含外部文件。 (我的意思是這些外部文件可以是庫?)
並且庫已經爲我們編寫了編譯好的程序。 (因此,我們需要預處理器指令將它們包含在C?)
預處理指令出現在源碼。有很多不同的指令。其中之一是#include
,用於包含頭文件。頭文件包含一組聲明,通常用於庫中的函數和類型(有時是變量)。但是,一個標題是而不是一個庫。
庫是已編譯的對象文件的集合。 C標準不能識別存在的庫(但它確實識別預處理器並定義了所需的行爲)。庫在鏈接器(編譯器)命令行中列出,通常使用-lname
表示法來定位庫name
,並使用-L
選項指定要搜索庫的位置。
請注意,標準C庫中定義的大多數函數都是由鏈接器找到的,而不需要知道它在哪裏查找它們。數學函數例外是由於歷史原因(主要涉及機器並不總是有浮點運算內置的—有時他們有FP協處理器,例如Intel 80386 + 80387,或者有時他們需要軟件仿真缺少硬件)。在許多系統上,您需要指定-lm
來鏈接數學庫;在別人身上,你沒有(代碼在主系統C庫中)。
一般來說,標題不能在與庫相同的目錄中找到(這將是一個雜亂的,不專業的項目,它將標題安裝到與其庫相同的目錄中)。
特別是在C++中,有些庫沒有預編譯的目標文件;這些服務僅通過標題定義。這些在C中不太常見。將文件視爲標題而不是庫是最明智的選擇。頭文件定義了一組可供編譯器使用的服務。圖書館提供對這些服務的支持。 (如果你仔細想想,或者看一下你的系統,你會發現<stdio.h>
不包括fprintf()
—的源代碼,其中有很多—的例子,但它確實聲明瞭fprintf()
,這樣你的程序就可以使用它因此標準C庫的實際功能將在運行時使用。)
庫文件所在的動態鏈接(共享對象的加載,即共享庫或動態鏈接庫(DLL))直到運行時才加載,程序啓動後(在調用main()
後)是另一個完整的平臺特定的bag'o'worms。
預處理器命令做了很多事情,其中之一是包含文件,如頭文件。圖書館大多提供編譯代碼來爲你做事,這是非常不同的。但是,大多數庫會要求您的代碼包含庫中的頭文件,以便您的代碼可以瞭解庫中可用的類型和功能。
有很多預處理指令,我將列出一些主題在這裏:
你可以找到許多關於預處理指令here
你也可以定義的#define或宏 –
常量@ user2957713你的意思是常數(使用#) –
是改變,常數的確:) –