前面學習過了 C 語言常用的三個預處理指令中的其中兩個:文件包括指令(#include)和宏定義指令(#define)。
下面來看一看,C 語言的第三個常用預處理指令——條件編譯指令。
1. 條件編譯是什麼條件編譯是指預處理器根據相關的條件編譯指令,選擇性将源代碼中的部分代碼送到編譯器進行編譯。
現在有着各式各類的操作系統,如 windows、mac、linux 等,手機都分安卓、iOS 等。有時候一套代碼适應某個系統,但不代表着也完全适應另一個系統。所以,就需要編寫不同的代碼,來适應各類的系統。
因此,就會出現這種情況。有的代碼對 iOS 有用,但是對安卓來說就是一堆垃圾。如果不管什麼系統,一股腦把所有代碼塞進去,隻會是增加内存的開銷,降低程序的效率。
而條件編譯的出現,就可以按照條件選擇性省略掉一部分無用的代碼,生成不同的目标文件,從而提高了程序的可移植性和靈活性。
同時,條件編譯還有一個最大的作用,避免頭文件重複引用的問題。頭文件之間可能會存在互相包含的關系,如果不預先處理,是會讓編譯器産生報錯的。
條件編譯的指令有如下幾個:
2. 條件編譯的格式
接下來了解一下條件編譯指令的主要格式:
第一種,#if-#elif-#else-#endif
#include<stdio.h>
#define AA 0
#define BB 1
int main(){
#if AA
printf("1");
#elif BB
printf("2");
#else
printf("3");
#endif
return 0;
}
運行結果:2
這種格式有點類似于判斷結構中的 if-else 條件語句,但又有着本質的區别。
一個是預處理指令,一個是編譯語句,執行的階段不同;編譯器所要處理的代碼量也不一樣。
第二種,#ifdef-#endif
#include<stdio.h>
#define AA 123;
#ifdef AA
#undef AA
#endif
int main(){
int AA = 33;
printf("%d", AA);
return 0;
}
運行結果:33
#ifdef 是用來判斷程序中是否已經定義了宏。如果已經定義了,那麼就執行 #ifdef 到 #endif 之間的内容;沒有定義,那麼跳過這個内容。
例如:我想在下面的代碼中使用 AA 這個标識符,但我不确定前面的内容(引用的頭文件裡面)中是否已經定義過标識符為 AA 的宏。
那我就可以用這個方法進行判斷,如果已經定義了 AA 這個宏,那就删除這個宏名,解放出标識符。
第三種,#ifndef-#endif
#include<stdio.h>
#ifndef PI
#define PI 3.1415
#endif
int main(){
printf("%f", PI);
return 0;
}
運行結果:3.1415
#ifndef 用來判斷,程序中是否沒有定義名字為某個标識符的宏。如果沒有,那就執行 #ifndef 到 #endif 之間的内容;如果已經定義了,那麼就會跳過這個部分的内容。
這個方法最常用在頭文件中,用來檢測頭文件是否被重複引用的問題。
// h1。h
#include "h2.h"
// h2.h
#include "h1.h"
// test.c
#include "h1.h"
#include "h2.h"
int main(){
return 0;
}
運行結果:錯誤,包含文件太多。
在相關的頭文件裡面,添加上 #ifndef-#endif 條件編譯,就可以避免這一錯誤。
// h1.h
#ifndef _H1_H_
#define _H1_H_
#include "h2.h"
// 頭文件中的相關内容
#endif
// h2.h
#ifndef _H2_H_
#define _H2_H_
#include "h1.h"
// 頭文件中的相關内容
#endif
值得注意的是:無論是哪一種條件編譯的格式,最終都要有一個 #endif 指令表示該條件編譯已經結束了。如果沒有,就會産生錯誤。
3. 條件編譯和條件語句的區别3.1 運行階段
條件編譯是屬于預處理指令,而預處理指令相當于是文本替換的作用。因此,條件編譯是在預處理階段,将滿足條件的代碼送到編譯器進行編譯。
而條件語句是屬于語句,是在編譯後,程序運行時才開始執行判斷。
3.2 編譯的代碼量
條件編譯隻會将滿足條件的部分代碼送到編譯器,而不滿足條件的代碼就會被清理掉。
條件語句則是全部的代碼都要進入編譯器。
假設:有 40000 行的代碼,其中 20000 行和 iOS 有關,另外 20000 行和安卓有關。如果使用條件語句,無論是 iOS,還是安卓,40000 行的代碼都需要進入到編譯器中編譯後,然後再進行判斷。
而條件編譯隻需要把相關的 20000 行代碼送到編譯器裡面就可以,很大程度上節省了編譯器的編譯時間,減少内存的開銷。
最後以上就是關于 C 語言條件編譯的内容。文中可能存在缺漏,或者錯誤的地方,敬請諸位指正,不勝感激。
如果您覺得文章對您有所幫助,或者還不錯,點個贊支持一下。(*=v=*)
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!