14.4條件編譯條件編譯屬于預處理程序,包括之前講的宏,都是程序在編譯之前做的一些必要的處理,這些都不是實際程序功能代碼,而僅僅是告訴編譯器需要進行的特定操作等。 條件編譯通常有三種用法,第一種表達式: #if 表達式 程序段 1 #else 程序段 2 #endif 作用:如果表達式的值為“真”(非0),則編譯程序段1,否則,編譯程序段2。在使用中,表達式通常是一個常量,事先用宏來進行聲明,通過宏聲明的值來確定到底執行哪段程序。 比如公司開發了同類的兩款產品,這兩款產品的功能有一部分是相同的,有一部分是不同的,同樣所編寫的程序大部分的代碼是一樣的,只有少部分有區別。這個時候為了方便程序的維護,可以把兩款產品的代碼寫到同一個工程程序中,然后把其中有區別的功能利用條件編譯。 #define PLAN 0 #if (PLAN == 0) 程序段1 #else 程序段2 #endif 這樣寫之后,當要編譯款式1的時候,把PLAN宏聲明成0即可,當要編譯款式2的時候,把宏聲明的值改為1或其它值即可。 第二種表達式和第三種表達式是類似的,使用哪一種要看具體情況或個人偏好。 表達式二: #ifdef 標識符 程序段1 #else 程序段2 #endif 表達式三: #ifndef 標識符 程序段1 #else 程序段2 #endif 在本章的示例中使用到了表達式三,表達式三的作用是:如果標識符沒有被#define命令所聲明過,則編譯程序段1,否則則編譯程序段2。此外,命令中的#else部分是可以省略的。表達式二和表達式三正好相反,實際#ifndef就是if no define的縮寫。 在頭文件的編寫過程中,為了防止命名的錯亂,每個.c文件對應的.h文件內的條件編譯的命名,也使用這個頭文件的名字,并且大寫,在中間加上下劃線,比如這個main.h的結構,首先要這樣寫: #ifndef _MAIN_H /*本段程序是寫在main.h文件中,程序段1為外部變量;外部函數;自定義數據類型等*/ #define _MAIN_H 程序段1 #endif 這樣說明的意思是,如果這個_MAIN_H沒有聲明過,那么就聲明_MAIN_H,并且的程序段1是有效的,最終結束;那么如果_MAIN_H已經聲明過了,那么也就不用再聲明了,同時程序段1也就無效了。 前邊頭文件重復包含的問題這樣就被解決了,編譯器在預編譯a.h時進行了#define _MAIN_H,而在預編譯b.h時,#ifndef _MAIN_H這一個條件就不成立,也就不會編譯b.h當中的這部分內容,這樣就有效的解決了頭文件重復包含的問題。
|