Keil 條件編譯之爬坑


條件編譯是編程一個很重要的,但是每一個編譯器有不同的寫法.經常使用不同編譯就容易混淆.所以也常常跳到坑里去.

單片機的調試由於受硬件影響,調試條件不是很好.出錯就會浪費很多時間.所以對條件編譯的理解到位很重要.

 

1 #if

1 #if expression
2 .
3 .
4 .
5 #endif

可以加上 #elif,和#else

例如下面這個例子.

這個例子是針對不同電壓,對程序保護添加的定義

那么先來定義不同電壓

#define V36V 36   
#define V48V 48  
#define V576V 576

再根據不同的電壓,定義保護電壓.

#if VOLTAGE ==V36V
  #define LowProtect 100 
  #define MaxVoltage 132 
  #define MinVoltage 112 
  #define MiddleVoltage 121
#elif VOLTAGE==V48V
  #define LowProtect 124 
  #define MaxVoltage 173
  #define MinVoltage 100
  #define MiddleVoltage 153
#elif VOLTAGE==V576V
  #define LowProtect 147 
  #define MaxVoltage 173
  #define MinVoltage 100
  #define MiddleVoltage 153

#endif

當編譯的時候只要加上一條對VOLTAGE的宏定義,

 

#define VOLTAGE 48 

 

這樣在編譯時,只需修改 VOLTAGE 的值即可,將它修改36 即為36V的保護電壓.

2 #ifdef

#ifdef name

#endif

 

#ifdef 表示如果定義name 就執行編譯name 里面的內容.

name 也可以被定義為宏定義.

這里要特別注意,當name被定義為宏定義時 name 的值不會起作用.

#define name 1

#ifdef name
.
.
#else
.
.
#endif

 

還有這種情況,如下代碼

#define Name1  0
#define Name2  1
#define Name3  0
#ifdef Name1 
  #define LowProtect 100 
  #define MaxVoltage 132 
  #define MinVoltage 112 
  #define MiddleVoltage 121
#endif
#ifdef Name2
  #define LowProtect 124 
  #define MaxVoltage 173
  #define MinVoltage 100
  #define MiddleVoltage 153
#endif
#ifdef Name3
  #define LowProtect 147 
  #define MaxVoltage 173
  #define MinVoltage 100
  #define MiddleVoltage 153

#endif

你覺得編譯器會報錯嗎?不報錯的話,會選擇編譯哪一個呢?

 

答案是不報錯,會選擇Name3 進行編譯.

所以最好不要寫成這種形式.

還是使用#if 的形式會好很多.

我就是在這里掉進了坑里,搞了一個多小時才弄清楚原因的.

keil 又不像VS一樣,選擇了不同的宏定義,IDE就自動將不需編譯的代碼顯示為灰色.

所以,掉坑了很正常.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM