標題: 第14章 實踐項目開發——智能溫控系統14.4 [打印本頁]
作者: 卓然塵世間 時間: 2026-5-13 09:43
標題: 第14章 實踐項目開發——智能溫控系統14.4
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當中的這部分內容,這樣就有效的解決了頭文件重復包含的問題。
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |