C/C++中条件编译#if、#elif、#ifdef等灵活秒用
2023-05-27 08:16:38 来源:面包芯语

前言

—般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译。此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译,相关的预编译指令如下:


(资料图)

#define

定义一个预处理宏

#undef

取消宏的定义

#if

编译预处理中的条件命令,相当于C语法中的if语句

#ifdef

判断某个宏是否被定义,若已定义,执行随后的语句

#ifndef

与#ifdef相反,判断某个宏是否未被定义

#elif

若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if

else

与#if, #ifdef, #ifndef对应,若这些条件不满足,则执行#else之后的语句,相当于C语法中的else

endif

#if, #ifdef, #ifndef这些条件命令的结束标志.

defined

与#if, #elif配合使用,判断某个宏是否被定义

条件编译功能

预处理程序提供了条件编译的功能。条件编译允许只编译源文件中满足条件的程序 段,使生成的目标程序较短,从而减少了内存的开销,并提高程序的效率,可以按不同的 条件去编译不同的程序部分,因而产生不同的目标代码文件,提高了程序的可移植性和灵活性。

应用举例

#undef

可以取消宏定义,与#define对应。

#define

#define命令定义一个宏,按照是否带参数通常分为对象宏、函数宏两种。

对象宏

不带参数的宏被称为"对象宏(objectlike macro)"。对象宏多用于定义常量、通用标识。例如:

函数宏

带参数的宏。利用宏可以提高代码的运行效率:子程序的调用需要压栈出栈,这一过程如果过于频繁会耗费掉大量的CPU运算资源。所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率。但多数c++程序不推荐使用函数宏,调试上有一定难度,可考虑使用c++的inline代替之。例如:

defined用来测试某个宏是否被定义。defined(name): 若宏被定义,则返回1,否则返回0。可用于在一条判断语句中声明多个判别条件,例如:

#ifdef、#ifndef、#else、#endif

#ifdef用于判断某个宏是否定义,和#ifndef功能正好相反,二者仅支持判断单个宏是否已经定义。

#if、#elif、#else、#endif

#if可支持同时判断多个宏的存在,与常量表达式配合使用。常用格式如下:

常量表达式可以是包含宏、算术运算、逻辑运算等等的合法C常量表达式,如果常量表达式为一个未定义的宏,那么它的值被视为0。

特别注意

#if 和 #ifdef的区别

在判断某个宏是否被定义时,应当避免使用#if,因为该宏的值可能就是被定义为0。而应当使用#ifdef或#ifndef。看两段段代码,哪段代码会被编译进去,强调下是编译进去,不是执行。

第一段条件编译:逻辑1会被编译进去

第二段条件编译:逻辑2会被编译进去

区别:

#if既关心宏是否定义,又关心宏的逻辑的真假。

#ifdef(#if defined())、#ifndef(#if !defined())仅关心宏是否被定义,不关心宏的逻辑真假。

#if 0 或 #if 1注释

当屏蔽掉大块代码时,使用"#if 0"比使用"/**/"要好。(因为用"/**/"做大段的注释时,需要防止被注释掉的代码段中有嵌套的"/**/",一旦出现"/**/"嵌套"/**/"的情况,会导致你注释掉的代码区域并不是你想要的区域范围) 。

1)常见的一种,如有一段不想要的代码,可以直接用"#if 0 ... #endif"形式来注释,效果等同于"/**/"

2)选择结构的条件编译。(如果常量为真【非0,随便什么数字,只要不是0】,就执行程序段1,否则执行程序段2。)

3)嵌套情况。(如果常量a为真【非0,随便什么数字,只要不是0】,就执行程序段1。当常量a为0且常量b为真时,执行程序段2;当常量a为0且常量b为0时,执行程序段3)

总结

有些程序在调试、兼容性、平台移植等情况下可能想要通过简单地设置一些参数就生成一个不同的软件,这当然可以通过变量设置,把所有可能用到的代码都写进去,在初始化时配置,但在不同的情况下可能只用到一部分代码,就没必要把所有代码都写进去,就可以用条件编译。条件编译是为了让程序在各种不同的软硬件环境下都以运行,提高其可移植性。

C/C++中条件编译#if、#elif、#ifdef等灵活秒用

2023-05-27

清穿之宠妃升级系统小说_清穿之宠妃升级系统 天天最新

2023-05-27

金斧头银斧头的故事文字完整版_金斧头银斧头的故事

2023-05-27

97只A股筹码大换手(5月26日)

2023-05-27

昆药集团(600422)龙虎榜数据(05-26)

2023-05-27

动画版孙悟空图片_2010年新西游记动画片里的孙悟空的图片谁有_环球速看料

2023-05-27

今亮点!今日辟谣(2023年5月26日)

2023-05-27

【世界时快讯】探访掏鸟案发生现场:有鸟窝的树早已被砍,案发后周边再无人敢掏鸟窝

2023-05-27

吴谢宇案将于5月30日上午宣判

2023-05-26

世界消息!第三届“黄浦教育·法理杯”高中生法治辩论赛落幕

2023-05-26

美少女养成游戏《火山的女儿》即将添加全新结局_环球热头条

2023-05-26

焦点热门:征和工业控股股东拟以1000万至1200万元增持公司股份

2023-05-26

富信科技:收到客户已启动ABCs(为债权人利益之转让)程序通知 天天日报

2023-05-26

“低糖、无糖”背后的甜味剂-每日精选

2023-05-26

《狂飙》张颂文未提名白玉兰 网友:不公平!

2023-05-26

突发!美国又被列入负面观察名单

2023-05-26

拿到已婚三儿的出轨证据,该不该发给她老公?-今日热议

2023-05-26

南京港(002040)5月26日主力资金净卖出132.59万元-环球新资讯

2023-05-26

今日热文:成交连降 北京二手房凉意加重

2023-05-26

即时看!速腾快递公司查单号_速腾快递单号官网

2023-05-26

没有情人的情人节图片搞笑带字_没有情人的情人节图片 观天下

2023-05-26

世界实时:格力博:5月25日融资买入3070.15万元,融资融券余额1.5亿元

2023-05-26

报道:背靠家纺大佬激进拿地 亚伦地产年内新增规模逼近头部国企 房地产“新势力”来了?

2023-05-26

欧文拒绝提前续约!向湖人提出3大条件,库班怒斥詹姆斯非法招募

2023-05-26

河南省十大特产零食(河南省十大特产) 全球速讯

2023-05-26

走近高铁制造“教头”:苦干、创新“磨”出行业标准|环球信息

2023-05-26

消息!嘉美包装董秘回复:公司是六个核桃战略合作伙伴,是其三片罐核心供应商和饮料生产代工基地

2023-05-26

沪锡价格反弹 原料端供应紧张【5月25日机构评论】

2023-05-26

天津四家法院将建营商环境“绿色通道” 环球新要闻

2023-05-26

amani间奏solo_amani

2023-05-26

美股异动 | 小赢科技(XYF.US)涨超6% Q1净收入环比增长5.2%-焦点速读

2023-05-26

萦绕的意思和读音_萦绕的意思

2023-05-26

金子美穗幽灵鬼屋

2023-05-26

当兵体重要求男多少斤(当兵体重要求)

2023-05-26

山西 10 岁遇害男孩父亲:我在等一个公正的处理结果-每日看点

2023-05-26

环球最资讯丨“文艺范”,正成台州城市新IP

2023-05-26

廉价氮化铁替代贵金属降低制氢成本

2023-05-26

天天热头条丨微信的大动作,为了什么?

2023-05-26

微盟尹世明:AIGC大模型供需两端存在“五大隔阂”

2023-05-25

即时看!腾讯会议如何同时视频和分享屏幕

2023-05-25

研究表明新的化合物显示出神经再生的潜力 环球观速讯

2023-05-25

游戏与泛娱乐出海白热化 谁来守护支付的“最后一公里”?

2023-05-25

责任照亮未来丨出发!共赴与三江源的约定|天天速讯

2023-05-25

环球视讯!2023凉山州养老金调整最新消息出炉吗?今年凉山州养老金怎么计算?

2023-05-25

商务部:将与中亚国家开展数字贸易 推动跨境基础设施建设|世界快资讯

2023-05-25

池州市青阳县荣获安徽省数字乡村建设优秀县称号

2023-05-25

德桑蒂斯入主白宫的可能性有多大 世界速讯

2023-05-25

中原消费金融网贷2千逾期还不起有起诉的风险吗

2023-05-25

高铁车票可以提前几天预定|微动态

2023-05-25

惠民保险可以带病投保是真的吗?惠民保险投保入口在哪?

2023-05-25

原帅个人资料和图片_原帅最新篮球明星动态

2023-05-25

焦点速递!大理回应棒棒糖树被嘲“买家秀” 是一颗普通的树 并非景点

2023-05-25

中级安全工程师证报考时间2023

2023-05-25

全球热资讯!标准时间同步时钟秒表在线 标准时间同步时钟

2023-05-25

稠油开发不再犯愁-全球实时

2023-05-25

热文:美联储会议纪要:6月加息分歧明显,银行业压力仍存

2023-05-25

菏泽涉及债权转让纠纷律师费用多少

2023-05-25

【独家】贝弗利:被湖人交易后火箭是心仪下家之一 火箭现在有一个好教练

2023-05-25

今日热文:产学研一体化人才培养_产学研一体化

2023-05-25

解子扬是解家的吗_解子扬

2023-05-25

【天天播资讯】5月24日基金净值:国寿安保稳鑫一年持有混合A最新净值0.9876,跌0.11%

2023-05-25

罗汉街道_关于罗汉街道介绍

2023-05-25

催泪!马龙赢球后谈4年变化,被问冲击世界第一,体现高情商

2023-05-25

街头霸王人物出招表_街头霸王人物|环球新动态

2023-05-25

文心一言回应“生成式AI散布不实消息”:对于无端的恶意抹黑污蔑将采取法律措施 快看

2023-05-25

每日精选:乌克兰驻德国大使:德将再向乌移交110辆“豹1”A5型坦克

2023-05-25

异鬼围城_异鬼_环球快看

2023-05-24

普通股筹资的优点 普通股 世界微速讯

2023-05-24

前沿资讯!智动力(300686):2023年5月23日投资者关系活动记录表

2023-05-24

螺杆潜水泵_优缺点|环球最资讯

2023-05-24

全球今头条!【世界说】美媒:美国最高法院对自己的腐败“视而不见”

2023-05-24

每日观点:魔术菇_关于魔术菇简述

2023-05-24

【环球时快讯】2023年湖南科学之夜“打卡”郴州宜章

2023-05-24

每日速讯:华为云在拉美发布ESW、CCI、Digital Avatar等一系列云服务

2023-05-24

速读:气象灾害导致200万人死亡

2023-05-24

房产达人手机版攻略分享 房产达人入门指南

2023-05-24

安吉丽娜朱莉纹身的意思_安吉丽娜朱莉纹身-天天快资讯

2023-05-24

追着花儿看新疆|新疆塔城发挥资源优势 带动百姓增收致富

2023-05-24

最新快讯!她曾是央视最美主持,却在拍戏时怀孕,今48岁孩子生父却至今是谜

2023-05-24

珠海港董秘回复:二级市场的股价表现受多方面因素影响,公司坚持稳健发展,做大做强主业|速递

2023-05-24

1 会计核算职能有何特点_会计核算职能有何特点_每日热闻

2023-05-24

速看:让观众领略不一样的“国家队” 国家大剧院合唱团2023国内巡演收官

2023-05-24

全球百事通!无锡市新开河小学:杜绝校园欺凌 共建平安校园

2023-05-24

环球通讯!通川区:“审计+”模式助力经济责任审计成果运用大提升

2023-05-24

澳大利亚即将对“先买后付”行业展开监管

2023-05-24

速读:新款汉只要18.98万起?加量不加价 三天都卖出1.3万辆了!

2023-05-24

在新场景中满足市民文化新需求

2023-05-24

即时:英联股份:宝钢包装是公司重要客户,公司与宝钢包装一直保持着稳定良好的合作关系

2023-05-24

韦达定理公式变形6个图片 韦达定理公式变形6个

2023-05-24

江铃福特领裕将于今日晚间正式上市

2023-05-24

声音|爱如何成为“生产力”-全球热点

2023-05-24

滔搏(06110)将于8月24日派发年度特別股息每股0.15元

2023-05-24

要闻:车险知识讲解_车险详解

2023-05-24

游戏行业景气度有望持续回升 机构看好龙头公司2023年业绩释放机会|视讯

2023-05-24

2023年世界互联网领先科技成果征集启动 天天热闻

2023-05-23

拖挂式房车排名 天天热头条

2023-05-23

马特乌斯:图赫尔用2个月时间把争冠机会弄没了,他应该为此负责

2023-05-23

猪毛菜的功效与作用 猪毛菜的吃法

2023-05-23

【全球速看料】陕西多地出台公积金优化政策,最高可贷60万

2023-05-23

2021-2022年流感流行季:我国流感疫苗接种率仅2.46% 全球观点

2023-05-23