历史上的今天
返回首页

历史上的今天

今天是:2025年01月31日(星期五)

2019年01月31日 | STM32程序中if和#if的区别

2019-01-31 来源:eefocus

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


推荐阅读

史海拾趣

Fujisoku Corporation公司的发展小趣事

“未来电子”深知人才是企业发展的第一资源。因此,公司高度重视人才培养和团队建设工作。通过建立完善的培训体系、激励机制和晋升通道,公司吸引并留住了一大批优秀的研发、生产和销售人才。这些人才在各自的岗位上发挥出色,为公司的快速发展提供了有力保障。同时,“未来电子”还注重团队合作和跨部门协作,通过组织丰富多彩的团队建设活动,增强了员工的归属感和凝聚力。

歌尔(Goertek)公司的发展小趣事

在电子废弃物处理成为全球关注焦点的背景下,“未来电子”积极倡导绿色生产和循环经济理念。公司投入大量资源研发环保型电子产品,并建立了完善的电子废弃物回收处理体系。通过技术创新和科学管理,“未来电子”实现了生产过程中的节能减排和废弃物的有效回收利用,赢得了社会各界的广泛赞誉。这一举措不仅提升了公司的社会形象,还为公司的可持续发展奠定了坚实基础。

Globaltech Semiconductor Co Ltd公司的发展小趣事

近年来,全球半导体行业面临了诸多挑战,包括供应链紧张、技术迭代加速等。面对这些挑战,Globaltech积极调整战略,加强与上游供应商和下游客户的沟通与合作,确保供应链的稳定。同时,公司还加大了对新技术和新产品的研发投入,以应对行业变化带来的挑战。通过这些努力,Globaltech不仅成功应对了行业挑战,还实现了业务的持续增长。

联捷(Elinker)公司的发展小趣事

近年来,随着人工智能和物联网技术的快速发展,电子行业迎来了转型升级的机遇。联捷(Elinker)紧跟时代潮流,积极推进智能制造和数字化转型。公司引进了先进的自动化生产线和智能化设备,提高了生产效率和产品质量。同时,公司还加大了对人工智能和物联网技术的研发力度,推出了一系列具有创新性的智能电子产品。

富之光(Fujicon)公司的发展小趣事

随着全球化进程的加速,富致科技也积极实施国际化战略。公司不仅在欧洲、北美等地设立了销售和服务网络,还通过参加国际展会、建立海外研发中心等方式,不断提升品牌影响力和市场竞争力。同时,富致科技还注重与全球顶尖企业和研究机构的合作,共同推动PPTC技术的创新与发展。

Federal Custom Cable公司的发展小趣事

Federal Custom Cable非常重视客户服务工作。他们建立了完善的客户服务体系,为客户提供从产品咨询、选型、定制到售后服务的全方位支持。同时,Federal Custom Cable还积极与合作伙伴建立长期稳定的合作关系,共同推动电缆行业的发展。这种以客户需求为导向、以合作伙伴关系为基础的经营模式,为Federal Custom Cable的持续发展提供了有力保障。

问答坊 | AI 解惑

用555电路做的欠压指示电路

本电路在实验中已经反复测试,在低于13.96V~14.11V时绿灯亮,正常情况下红灯亮。图中D8为双色发光二极管。 电路原理:电池电压为16.8V(四块单板电池)。通过稳压管给555电路一个5脚一个6.2V的参考电压,当2脚的电压高于3.1V时,555电路3脚输出低电 ...…

查看全部问答>

你见过吗?反语翻译机

14.66美金就可以拥有一个反语翻译机!可能他会让你捧腹大笑,因为它会录下你说的所有话,然后逐字逐句反过来播放! 可能你会因此创造很爆笑很棒的词,或者发现自己平时在讲的话,竟然是那么的有趣! …

查看全部问答>

急!!为什么编译时,evc模拟器连接不上

为什么每次编译时总提示:“one or more files from the Emulator foe Windows CE installation is missing.  Reinstall Emulator ...\" 使用标准的模拟器,为什么会这样呢?我重装了一次eVC4.0,还是这样。一个简单的\"Hello Applicati ...…

查看全部问答>

问个问题,WINCE4.2下,怎么用C#写WAV文件的声音播放程序?

大家给个提示,我用的WINCE4.2系统,VS2003的C#开发的.…

查看全部问答>

关于wince关机问题,如何在关机后启动另个程序

我在donet1.0下想实现关机后向服务器发送一个logoff的消息,查阅了api后我调用CeRunAppAtEvent,注册NOTIFICATION_EVENT_OFF_AC_POWER,希望在关机后启动另一个exe来做发送logoff的工作,但是没有反应,我试着注册了其他几个,例如NOTIFICATION_EVE ...…

查看全部问答>

楼宇对讲通信网中的安全技术

楼宇对讲通信网络是无线电通信技术中的一个重要应用领域和组成部分,这项技术的开发和应用开始于上个世纪的20年代,当时主要使用在警察局总部与巡警车之间的车载移动通信服务――并迅速在警察部门得到推广应用。1946年,美国的AT&T公司开发设计出 ...…

查看全部问答>

STM32_IAP例程好像有问题

请教版主,我用st网站提供的“STM32F10x_IAP_V3.1.0”例程时发现,用232下载程序时,iap一切正常,可是改为485通信时,iap跑到Ymodem_Receive 中就不能向外发数据 ,在此之前485发出数据一切正常。程序进入Ymodem_Receive 后,在下面程序“*” ...…

查看全部问答>

求AD转换数值不对,咋回事

请问各位大师,我AD转换的数值不对怎么回事?而且数值不变,我是测温用的,数值应该时刻变化啊…

查看全部问答>

LM3S2B93的LDO问题

利用LM3S2B93设计电路,原本想利用片内LDO提供VDDC,但是在ERRATA中看到,利用片内LDO,存在问题There is a small risk of flash corruption or device failure on power up. The issue can occur with certain VDD and VDDC power sequences. The ...…

查看全部问答>

TI图形库里面的颜色格式是如何定义的?

Grilb.h文件里面如下 #define ClrBlue                 0x000000FF #define ClrRed             ...…

查看全部问答>