(1)首先,if是條件語句,#if是預處理指令,功能相同,執行的時期不同
(2)舉例1:
#define A 2
#if A==2
void foo()
{
printf("A == 2");
}
#else
void foo()
{
printf("A != 2");
}
#endif
int main()
{
foo();
}
舉例2:
這樣會輸出 A == 2
如果改變#define A 2就可能會輸出A != 2
#if.
a
#else
b
#endif,其實這個就是選擇編譯那部分,和if-else的區別就是:編譯的時候進行選擇的,如果是a的話,b那么就根本不去編譯,而if-else是全部編譯好的,然后再去運行
那么問題來了,用#if #else的預處理方式,如果是a的話,那么在程序運行中,條件滿足else了,那么會執行b嗎??
答案是:不會,原因在(3)中解釋
(3)#if的作用:有些程序在調試、兼容性、平臺移植等情況下可能想要通過簡單地設置一些參數就生成一個不同的軟件,這當然可以通過變量設置,把所有可能用到的代碼都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分代碼,就沒必要把所有的代碼都寫進去,就可以用條件編譯,通過預編譯指令設置編譯條件,在不同的需要時編譯不同的代碼。
所以,一旦預處理條件部分編譯后,在運行中只執行符合條件的部分代碼塊
即可以設置不同的條件,在編譯時編譯不同的代碼,預編譯指令中的表達式與C語言本身的表達式基本一至如邏輯運算、算術運算、位運算等均可以在預編譯指令中使用。之所以能夠實現條件編譯是因為預編譯指令是在編譯之前進行處理的,通過預編譯進行宏替換、條件選擇代碼段,然后生成最后的待編譯代碼,最后進行編譯。
#if 的一般含義是如果#if 后面的常量表達式為true,則編譯它所控制的代碼,如條件1成立時就代碼段1,條件1不成立再看條件2是否成立,如果條件2成立則編譯代碼段2,否則再依次類推判斷其它條件,如果條件1-N都不成力則會編譯最后的代碼段n+1。
(4)#if的好處:系統裁剪
系統裁剪是針對系統的用途,對系統的源代碼進行一下優化,減少不必要的功能。
/*--------------------------------------------------------------------*/
#include“stdio.h”
#define TEST_2 1
int main()
{
int a=11;
#if TEST_2
int *b=&a;
*b = 10;
#endif
a++;
}
/*----------------------------------------------------------------------*/
如上面的例子,對于某些功能不需要,我們只需對于的功能TEST_2的宏定義改成0,然后重新編譯就行了。當然一般宏定義是放在一個特定的文件(這里為了簡單就寫在一起),這樣外面的人只需要更改那個文件所對應的值就行對系統進行裁剪而不需要關心具體代碼,就行實現裁剪。
上一篇:STM32F4移植FAT32系統出現的問題歸納總結
下一篇:關于STM32程序仿真時卡死在default_handler的解決方法
推薦閱讀
史海拾趣
隨著市場競爭的加劇,D+H Mechatronic AG開始調整其市場布局策略。公司根據市場需求和產品特點,有針對性地開拓新的市場領域。同時,公司還加強了與客戶的溝通和合作,深入了解客戶需求并提供定制化的解決方案。這些舉措使公司在激烈的市場競爭中保持了穩定的增長態勢,并逐步鞏固了其在電子行業中的地位。
隨著環保意識的不斷提高,綠色環保已經成為電子行業的發展趨勢。EHC公司積極響應這一趨勢,致力于研發和生產綠色環保的電子產品。公司采用環保材料和工藝,減少生產過程中的污染排放。同時,EHC公司還積極推動廢舊電子產品的回收和再利用工作,為環保事業做出了積極貢獻。這種對環保的關注和行動讓EHC公司在行業中樹立了良好的形象。
作為全球領先的電子元器件制造商之一,EPCOS在通信領域取得了顯著的突破。其電容器、電感器等產品在通信系統中發揮著關鍵作用,為各種通信設備提供了穩定的電源和信號處理方案。EPCOS不斷投入研發資源,致力于開發適應新一代通信技術需求的高性能電子元器件。這些創新產品不僅提高了通信系統的性能和可靠性,也推動了整個通信行業的進步。
以上是關于EPCOS/TDK公司發展起來的5個相關故事。這些故事不僅展示了公司在技術創新、市場拓展等方面的成就,也體現了其在電子行業中的重要地位和影響力。
AEL Crystals Ltd公司成立于1960年,最初專注于石英頻率控制元件的研發與生產。在創立初期,公司面臨著技術挑戰和市場競爭的雙重壓力。然而,憑借創始人的遠見卓識和團隊的不懈努力,AEL Crystals逐漸在石英頻率控制領域站穩了腳跟。公司通過持續改進生產工藝和提高產品質量,逐漸贏得了客戶的信任和支持。
隨著國內市場的日益飽和,Asian Best Components Co Ltd開始將目光投向了廣闊的國際市場。公司積極參加國際電子展會,與全球各地的客戶建立了廣泛的聯系。通過深入了解不同市場的需求和特點,Asian Best不斷調整產品策略,優化產品設計,成功打入多個國際市場。同時,公司還加強與國際同行的合作,共同推動電子行業的發展。
PCB抄板信號隔離技術是使數字或模擬信號在發送時不存在穿越發送和接收端之間屏障的電流連接。這允許發送和接收端外的地或基準電平之差值可以高達幾千伏,并且防止可能損害信號的不同地電位之間的環路電流,主要應用在: (1)系統地的噪聲比較大, ...… 查看全部問答∨ |
|
我想在DM6446的ARM端做個嵌入式視頻服務器,就是在PC上可以用IE來瀏覽DM6446采集的視頻,我現在知道一些boa的知識,能移植boa來用IE瀏覽簡單的靜態網頁,可以把采集的視頻通過TCP協議傳輸到PC上保存成一個文件。 我想問的是:我現在怎樣來做這 ...… 查看全部問答∨ |
我想基于NDIS編程監控木馬通信實現木馬的檢測,但現在不知道這樣做可行否,并且用它和用Winpcap等開發包有什么不同,比winpcap有優勢嗎?因為我知道winpcap的底層也是用NDIS的。很迷惑,著急!謝謝!… 查看全部問答∨ |
第一次在PIC單片機中寫C語言程序。全按照《嵌入式C語言編程與Microchip PIC》這本書上講的寫的。 但是總是有幾個地方編譯出錯。 以下是在編譯器中,出錯的代碼部分(在編譯器中是紅色的) 這是怎么回事啊????? #include<pic.h ...… 查看全部問答∨ |
工業應用中有大量系統需要遠程數據傳輸,如遠程電表抄寫,工業調度監控等。GPRS技術在這些系統中得到廣泛應用,如何構建高性價比的方案成為系統設計人員的一個首要問題。 S260是一款極具性價比的嵌入式GSM/GPRS模塊。S260工作于900/1800/1900MHz頻 ...… 查看全部問答∨ |