历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2018年08月12日 | stm32f429之#ifndef的用法

2018-08-12 来源:eefocus

作用:防止头文件的重复包含和编译


定义


  #ifndef x


  #define x


  ...


  #endif


  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。


  #ifndef x


  //先测试x是否被宏定义过


  #define x


  //如果没有宏定义下面就宏定义x并编译下面的语句


  ...


  #endif


  //如果已经定义了则编译#endif后面的语句


  条件指示符#ifndef检查预编译常量在前面是否已经被宏定义。如果在前面没有被宏定义,则条件指示符的值为真,于是从#ifndef到#endif之间的所有语句都被包含进来进行编译处理。相反,如果#ifndef指示符的值为假,则它与#endif指示符之间的行将被忽略。条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。


补充一些内容


  千万不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。


  还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:


  #ifndef <标识>


  #define <标识>


  ......


  #endif


  <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h


  #ifndef _STDIO_H_


  #define _STDIO_H_


  ......


#endif


#ifndef xxx//如果没有定义xxx

#define xxx//定义xxx

#endif //结束如果

这个用法主要是在头文件中,主要是为了防止类重复的include,所以在类的头文件之前加上前面两个,用类名替代xxx,在最后加上最后一句。

const 与 #define的比较

    C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:

(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。

 

(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

        

【规则5-2-1】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。


推荐阅读

史海拾趣

ELINA INDEK公司的发展小趣事

在电子行业中,技术变革日新月异,市场竞争异常激烈。面对这些挑战,因美纳始终保持着敏锐的洞察力和灵活的反应能力。公司不断调整产品策略和市场布局,积极应对行业变革。同时,因美纳还注重培养员工的创新能力和团队协作精神,为公司的发展提供源源不断的动力。

General Magnetics Inc公司的发展小趣事
绝缘损坏或元件故障可能导致漏电,影响电路的安全性和稳定性。
Advanced Microelectronic Products Inc公司的发展小趣事

在追求经济效益的同时,AMP公司也积极履行社会责任,致力于实现可持续发展。公司注重环保和节能减排,采用先进的生产工艺和设备,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会发展和进步贡献力量。这些举措不仅提升了AMP公司的社会形象,也为其赢得了更多消费者的支持和信任。

请注意,以上故事均为虚构内容,旨在展示一个假设的电子行业公司在发展过程中可能遇到的情境和策略。实际公司的发展历程和细节将因公司而异,并受到市场环境、技术变革、政策调整等多种因素的影响。

BeagleBoard公司的发展小趣事

随着产品线的不断丰富和品质的不断提升,BeagleBoard公司在市场上逐渐获得了更多的认可。他们不仅在国内市场取得了显著的成绩,还积极拓展国际市场,与全球范围内的开发者和企业建立了广泛的合作关系。通过与合作伙伴的共同努力,BeagleBoard的产品逐渐渗透到各个行业领域,为嵌入式系统的发展做出了重要贡献。

ELM [ELM Electronics]公司的发展小趣事

ELM始终将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,ELM还注重客户需求和反馈,不断优化产品和服务,以满足客户的个性化需求。这些举措使得ELM的产品在市场上享有很高的声誉和口碑,客户满意度持续提升。

Genisco Electronics公司的发展小趣事
如电压传感器、频率检测器等,用于实时监测电网电源和自备发电电源的状态。

问答坊 | AI 解惑

精密整流滤波电路图

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 我想要一个精密整流滤波电路图,其输入交流电压为0到4v.  …

查看全部问答>

资料

大家多传一些资料哈…

查看全部问答>

求一个红外对管应用电路

本帖最后由 paulhyde 于 2014-9-15 03:52 编辑 求一个红外对管应用电路,发射接收管安放在相距20CM,当有物体经过,接收管就会给控制系统(单片机),一个开关信号; 那位大虾有就给我个电路,主要是接收管电路的问题。 如果有能达到相应效果的 ...…

查看全部问答>

基于LabVIEW的虚拟信号处理系统

基于LabVIEW的虚拟信号处理系统…

查看全部问答>

大家使用protel还是cadence?

大家在工作中硬件设计时是protel用的多还是cadence用的多啊?…

查看全部问答>

sja1000,ep9307,can通信驱动,连续接收4帧后,第5帧,经常丢失

os:wince5.0 cpu:ep9307 200MHz CAN:sja1000 ------------------------- 我现在用的是一块工控板,直接用的别人给的nk.bin,有can的驱动源码 我在wince里做应用,发现别人连续发送5帧的话,大部分情况下,只能接收到前4帧。 我做了个测试 ...…

查看全部问答>

连连看游戏能写入单片机吗?

连连看游戏能写入单片机吗? 还有一个50M的程序能写入单片机吗,单片机最大的程序空间最大为多少容量?    求助各位大虾…

查看全部问答>

香水,ST有没有能跑wince的ARM呀?

                                 我看M系列都是总线不开放的芯片。那样的芯片跑CE几乎不可能的…

查看全部问答>

HELP 急急急

原来用的msp430f1232  换成msp430f2232后仿真器找不到单片机 电路和原来是一样的  难道是我的仿真器不支持2系列?我的仿真器版本是MSP-FETP430F1.3…

查看全部问答>

请问论坛好友有什么功能?

请问论坛好友有什么功能?…

查看全部问答>