1. 條件編譯
條件編譯是指預先處理根據測試的結果來包含或排除程式的片段。
2. #if和#endif
也不多說,舉個例子就懂了。
#define DEBUG 1int main (void){#if DEBUG printf("Hello world");#endif return 0;}
其實效果就是類似於這樣的代碼:
int main (void){ int debug=1; if(debug) printf("Hello world"); return 0;}
不同的是:預先處理命令是由前置處理器來處理。#if指令會測試DEBUG的值,如果DEBUG的值是0,那麼這個printf就不會儲存在目標程式中佔用空間,也不會消耗程式的運行時時間。因此,我們在測試時可以將這段代碼儲存到最終代碼中。
3. 一些相似的條件編譯符號
defined運算子通常與#if聯合使用,來判斷某宏定義是否被定義。
#define DEBUG 1int main (void){#if defined DEBUG printf("Hello world");#endif return 0;}
與其同樣語義的還可以這樣來寫:
#define DEBUG 1int main (void){#ifdef DEBUG printf("Hello world");#endif return 0;}
當然,還有#ifndef代表if not defined的語義。
#elif:else if
#else。
這些都是可以與#if配合使用的,和一般的條件判斷語義一樣。不再重複舉例子。
4. 條件編譯的用處
A. 調試。
B. 編寫不同作業系統,不同平台,不同編譯器使用的程式。
例如:
#define WINDOWSint main (void){#if defined WINDOWS printf("WINDOWS");#elif defined LINUX printf("LINUX");#else printf("ELSE");#endif return 0;}
C. 臨時屏蔽代碼
5. #error指令
遇到#error意味著遇到了比較嚴重的錯誤,編譯器會立即終止程式,例如:
int main (void){#if defined WINDOWS printf("WINDOWS");#elif defined LINUX printf("LINUX");#else #error Not Support#endif return 0;}
6. 託管式實現和獨立式實現
這是一個基礎的概念。
大部分程式都是託管式實現,這些程式都需要底層的作業系統來提供輸入輸出以及其他的一些基本服務,而C的獨立式實現用於不需要作業系統的程式。
一般來說,獨立式程式用於編寫作業系統核心以及嵌入式程式。