VI. 編譯預先處理
編譯預先處理是指在對程式進行編譯之前所做的預加工處理,此工作在對每一個程式進行編譯時間都自動進行。
一、ANSI C 定義的標準預先處理指令:
#if
#ifdef
#ifndef
#else
#elif
#endif
#define
#undef
#line
#error
#pragma
#include
前置處理器處理的對象是預先處理指令(preprocessor directives),輸出是“翻譯單元”(是存放在記憶體中的臨時檔案)。
編譯器接受前置處理器的輸出,並把原始碼轉換成包含機器語言指令的目標檔案。
二、書寫規定與習慣:
1、每條指令必須單獨佔用一行。
2、每行末尾不加 ;(因為不是語句)。
3、一般使用全部大寫來表示標識符。如: #define LANGUAGE chinese
4、一個預先處理指令可以寫在程式中的任何位置。通過合理地使用這些指令,可以提高程式的可讀性和可移植性。
三、關於 #define 的一些說明:
1、宏中的參數只原樣替換,並不求值,而函數的參數則不然。
2、宏中的參數不會被分配記憶體空間。
3、宏只佔用編譯時間,而不佔用已耗用時間,但函數則相反。
4、宏被替換後,可能使代碼加長,而函數則不會。使用函數的一個主要目的就是是代碼可以重用,起到簡化代碼的作用。
5、宏比函數具有更好的資料類型的適應性(因為它沒有參數類型的要求)。
6、宏不能遞迴調用。
使用類函數宏代替函數的一個主要的優點是能夠提高代碼的速度(消除了調用的開銷)。但是,若類函數宏的尺寸非常大,則會因為複製代碼而增加了程式的規模。所以,在 C99 和 C++ 中,定義了 inline 關鍵字,使程式員能夠更好地定義內聯代碼。
四、關於 #include 的一些說明:
1、檔案包含是一種模組化程式的手段,有助於代碼的重用。
2、習慣:程式員可將經常使用的常量(宏定義)、多個源檔案共同使用的全域變數、函式宣告等寫成一個或分類寫成多個檔案,在需要時,可以用 #include 將它(們)包含進來。
3、包含檔案中允許嵌套包含(可以包含其它 #include 指令)。允許的最大嵌套深度隨編譯器的不同而不同。C89 規定編譯器最少應能處理 8 層嵌套包含,C99 提升到 15 層。
五、關於條件編譯的一些說明:
1、條件編譯是為了使商業軟體具有更廣泛的適應性(或可移植性)而提供的功能。
2、C89 規定,#if -- #elif、#ifdef 和 #ifndef 的嵌套深度最少為 8 層,C99 提升至 63 層。
3、[執行個體1] #ifdef IBM-PC #define INTSIZE 2 #else #define INTSIZE 4 #endif
[執行個體2]符號 NULL 在 6 個不同的檔案中都有定義:locate.h、stddef.h、stdio.h、stdlib.h、string.h、time.h。一個源檔案可能包含其中的幾個標頭檔,這樣會使編譯器報錯。這時需要在每個標頭檔中使用條件編譯: #ifndef NULL #define NULL ((void *)0) #endif