條件編譯是編程一個很重要的,但是每一個編譯器有不同的寫法.經常使用不同編譯就容易混淆.所以也常常跳到坑里去.
單片機的調試由於受硬件影響,調試條件不是很好.出錯就會浪費很多時間.所以對條件編譯的理解到位很重要.
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就自動將不需編譯的代碼顯示為灰色.
所以,掉坑了很正常.