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就自动将不需编译的代码显示为灰色.

所以,掉坑了很正常.

 

posted @ 2016-01-08 10:25  crcruicai  阅读(3756)  评论(0编辑  收藏  举报