Keil 條件編譯之爬坑

jopen 8年前發布 | 6K 次閱讀 技術

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

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

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就自動將不需編譯的代碼顯示為灰色.

所以,掉坑了很正常.

來自: http://www.cnblogs.com/TopC/p/5112269.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!