2013-12-19 44 views
-1

我想知道C中的預處理器指令和庫之間有什麼區別?預處理器指令和庫之間的區別

到目前爲止,我知道預處理指令用於包含外部文件。 (我的意思是這些外部文件可以是庫?)

並且庫已經爲我們編寫了編譯好的程序。 (因此,我們需要預處理器指令將它們包含在C?)

+0

你也可以定義的#define或宏 –

+0

常量@ user2957713你的意思是常數(使用#) –

+0

是改變,常數的確:) –

回答

2

預處理指令出現在源碼。有很多不同的指令。其中之一是#include,用於包含頭文件。頭文件包含一組聲明,通常用於庫中的函數和類型(有時是變量)。但是,一個標題是而不是一個庫。

庫是已編譯的對象文件的集合。 C標準不能識別存在的庫(但它確實識別預處理器並定義了所需的行爲)。庫在鏈接器(編譯器)命令行中列出,通常使用-lname表示法來定位庫name,並使用-L選項指定要搜索庫的位置。

請注意,標準C庫中定義的大多數函數都是由鏈接器找到的,而不需要知道它在哪裏查找它們。數學函數例外是由於歷史原因(主要涉及機器並不總是有浮點運算內置的—有時他們有FP協處理器,例如Intel 80386 + 80387,或者有時他們需要軟件仿真缺少硬件)。在許多系統上,您需要指定-lm來鏈接數學庫;在別人身上,你沒有(代碼在主系統C庫中)。

一般來說,標題不能在與庫相同的目錄中找到(這將是一個雜亂的,不專業的項目,它將標題安裝到與其庫相同的目錄中)。

特別是在C++中,有些庫沒有預編譯的目標文件;這些服務僅通過標題定義。這些在C中不太常見。將文件視爲標題而不是庫是最明智的選擇。頭文件定義了一組可供編譯器使用的服務。圖書館提供對這些服務的支持。 (如果你仔細想想,或者看一下你的系統,你會發現<stdio.h>不包括fprintf() —的源代碼,其中有很多—的例子,但它確實聲明瞭fprintf(),這樣你的程序就可以使用它因此標準C庫的實際功能將在運行時使用。)

庫文件所在的動態鏈接(共享對象的加載,即共享庫或動態鏈接庫(DLL))直到運行時才加載,程序啓動後(在調用main()後)是另一個完整的平臺特定的bag'o'worms。

1

預處理器命令做了很多事情,其中​​之一是包含文件,如頭文件。圖書館大多提供編譯代碼來爲你做事,這是非常不同的。但是,大多數庫會要求您的代碼包含庫中的頭文件,以便您的代碼可以瞭解庫中可用的類型和功能。

1

有很多預處理指令,我將列出一些主題在這裏:

  • 的#define:用於定義常量或marcro(帶或不帶參數)
  • #包括:其中包含文件(使用「「)或庫(使用<>)
  • 的#if的#ifdef:用於編譯上當某些條件都充滿的代碼LY部分(他們八方通之後#ENDIF)
  • ...

你可以找到許多關於預處理指令here