天天看點

STM32程式中if和#if的差別

(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,然後重新編譯就行了。當然一般宏定義是放在一個特定的檔案(這裡為了簡單就寫在一起),這樣外面的人隻需要更改那個檔案所對應的值就行對系統進行裁剪而不需要關心具體代碼,就行實作裁剪。

繼續閱讀