tft每日頭條

 > 生活

 > c語言預處理命令是不是語句

c語言預處理命令是不是語句

生活 更新时间:2025-01-25 00:00:36

c語言預處理命令是不是語句(C語言常用的預處理指令條件編譯)1

前面學習過了 C 語言常用的三個預處理指令中的其中兩個:文件包括指令(#include)和宏定義指令(#define)。

下面來看一看,C 語言的第三個常用預處理指令——條件編譯指令。

1. 條件編譯是什麼

條件編譯是指預處理器根據相關的條件編譯指令,選擇性将源代碼中的部分代碼送到編譯器進行編譯。

現在有着各式各類的操作系統,如 windows、mac、linux 等,手機都分安卓、iOS 等。有時候一套代碼适應某個系統,但不代表着也完全适應另一個系統。所以,就需要編寫不同的代碼,來适應各類的系統。

因此,就會出現這種情況。有的代碼對 iOS 有用,但是對安卓來說就是一堆垃圾。如果不管什麼系統,一股腦把所有代碼塞進去,隻會是增加内存的開銷,降低程序的效率。

而條件編譯的出現,就可以按照條件選擇性省略掉一部分無用的代碼,生成不同的目标文件,從而提高了程序的可移植性和靈活性

同時,條件編譯還有一個最大的作用,避免頭文件重複引用的問題。頭文件之間可能會存在互相包含的關系,如果不預先處理,是會讓編譯器産生報錯的。

條件編譯的指令有如下幾個:

c語言預處理命令是不是語句(C語言常用的預處理指令條件編譯)2

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved