天天看点

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,然后重新编译就行了。当然一般宏定义是放在一个特定的文件(这里为了简单就写在一起),这样外面的人只需要更改那个文件所对应的值就行对系统进行裁剪而不需要关心具体代码,就行实现裁剪。

继续阅读