预处理指令用法详解(C语言)_实时焦点
前言
使编译器执行预处理操作的代码被称为预处理指令,本文介绍常见的预处理指令的实际用法。
一、预处理符号
预处理符号是C语言内置的符号,是可以直接使用的。
(资料图)
其中,若遵顼ANSI C,则__STDC__
为1,否则未定义。
二、#define
1)定义标识符
#define可以用来定义标识符,其语法为:#define name stuff
,经过预处理后,stuff
会被直接替换为·name
。
若stuff
的内若过长,可在句末加上\
续行符号,像这样:
#include#define Piccaso "Pablo,Diego,José\Francisco,de,Paula,Juan,Nepomuceno\,María,de,los,Remedios,Cipriano,de\,la,Santísima,Trinidad,Ruiz,y,Picasso"int main(){printf("%s", Piccaso);return 0;}
示例1:数值替换
int main(){int a = 100;return 0;}
示例2:循环替换
#includeint main(){while(1){printf("A");}return 0;}
运行代码,将会在屏幕上死循环地打印A
。
示例3:分支替换
int main(){int input = 0;switch (input){case 1:break; case 2:break; case 3:}return 0;}
2)宏定义
#define允许有参数的文本替换,这种操作通常称为宏,其语法为:#define name(list) stuff
,其中,list
是由逗号隔开的符号表,符号有可能出现在stuff
中。
示例1:
int main(){printf("%d", 5+5);return 0;}
示例2:
int main(){printf("%d", 10*double(5+1));return 0;}
因为#define
的功能只是替换,若要利用宏定义实现快捷的函数操作,最好的方法是在宏定义时多加括号,以便于达到整体求值的效果,像这样:#define double(x) (x)+(x)
。
注意:由于宏是直接替换,因此传参时严禁使用自增,自减,传参时使用,替换后依然会再次执行,会导致不可预测的后果。
3)字符串转换符
字符串有自动连接的特点,例如运行以下这段代码:
#includeint main(){printf("123" "456");return 0;}
效果图:
字符串转换符#就是利用这个特性,它可以将宏定义中传入的参数,替换为字符串格式。
#include#define sum(x) printf("the val of "#x" is %d",x)int main(){int a = 10;sum(a);return 0;}
在上述代码中,#号
将a
直接转化为字符串,随后三个字符串拼接在一起。
效果图:
利用该方法可以只传参一次实现值和名
同时打印。
4)片段链接符
在宏定义时,片段连接符##
可以实现将两个符号连接在一起,使其成为一个符号,前提是这个合成的符号必须已经被定义。
#include#define double(x) sum##x*=2int main(){int sum1 = 1;int sum2 = 1;int sum3 = 1;double(1);printf("%d %d %d", sum1, sum2, sum3);return 0;}
在上述代码中,##
会把sum和参数x连接在一起,当我们传入1经过预处理后,等效于:sum1*=2
。
效果图:
5)宏定义VS函数
宏定义的优势:
宏定义的执行速度远远超过函数,当执行简单的计算时,更适合使用宏定义。宏定义传参时没有类型检测,可以将任意的数据传入。宏定义是直接替换,可以传入各种各样的符号,实现许许多多函数做不到的功能。(可以传入类型、传入函数、传入语句等等)宏定义的劣势:
宏定义不能调试、不能递归,因此宏定义只适合做简单的计算。宏定义是直接替换,因此相邻操作符的优先级很有可能产生不期望的顺序,因此要尽可能带括号。宏定义传参没有类型检测,因此不够严谨。6)命名公约
以下几条公约,必须遵守
宏定义的名必须全部大写。函数名不可以全部大写。三、#undef#undef
宏定义删除,可以在函数内部使用!被删除后的标识就不能再使用了。
四、命令行编译
指在VScode
或Linux
等用命令行执行编译的环境下,可以在编译时对变量进行赋值。
五、条件编译
在写程序时,有些代码是为了查看某个部分是否正确而写的的调试代码。
删除很可惜,但又不想让其编译,此时就可以使用选择性编译
。
但实质上使用if
语句或直接注释
会更加方便,但在C语言内置的头文件中,为了节约时间经常使用条件编译。
1)常量表达式判断
#if 常量表达式//...#endif
常量表达式为真,则中间的语句编译;
常量表达式为假,则中间的语句不编译。
此外,也可以写成多分支的表达式条件编译。
int main(){#if 0printf("111");#elif 1printf("222");#else 0printf("333");#endifreturn 0;}
效果图:
2)是否定义判断
判断某个符号是否被定义,只要被定义,就编译中间的语句,无论其被定义为什么。
#include#define MAXint main(){#if defined(MAX)//或#ifdef MAXprintf("111");#endifreturn 0;}
或判断某个符号是否没定义,没定义则编译。
#include#define MAXint main(){#if !defined(MAX)//或#ifndef MAXprintf("111");#endifreturn 0;}
3)嵌套判断
条件编译是可以互相嵌套的。
#include#define DEBUG int main(){#ifdef DEBUG#if 1printf("111");#elif 0printf("222");#endif#endif return 0;}
如上述代码是在是否定义判断中嵌套常量表达式判断。
效果图:
六、头文件的包含
1)双引号与尖括号
对于#include
来说,后面的文件有两种引用方法:
所有的头文件在包含时都可以使用双引号,但为了速度和区别位置,建议自己写的头文件用双引号,标准库中的用尖括号。
2)头文件的嵌套包含
可以将许许多多的头文件都包含在一个自己创建的头文件中,最后只需要在其他的源文件中包含该自己创建的头文件即可,像这样:
3)头文件重复包含解决方法
在写多人合作的大型项目时,每个程序员可能都要包含一次公用的头文件,当他们写的代码汇总时,这个头文件可能会被包含多次。
因此,我们使用条件编译来解决这个问题。
#if !defined(TIME)#define TIME //...//... //在这里实现各种函数//...#endif
假设上述代码为head.h
,当我们第一次包含head.h
时,由于TIME没有被定义,因此会定义一个TIME,同时编译里面的函数。
当我们第二次包含head.h
时,因为TIME被定义过了,即使head.h
里面的内容被拷贝到源文件中,也不会进行编译,从而加快了速度。
注意:在头文件开头加入#pragma once
即可一键实现上述效果,不必冗杂的代码,但仅限于自己写的头文件,标准库的头文件已经帮你加完了。
感谢您的阅读与耐心~
标签: 编程算法
推荐
- 预处理指令用法详解(C语言)_实时焦点
- 股票和债券有什么区别
- 表现手法的作用 表现手法的七个作用-焦点速看
- 当前热点-二月里来是冼星海的作品吗_二月里来
- 氟化工“巨无霸”诞生,昊华科技复牌涨停!能否再现连板奇观?|全球聚焦
- 全球信息:我科学家发现影响胰腺癌进展新机制
- 新城控股原老总猥亵女童二审宣判 拒不供认判刑五年 世界观察
- 【报资讯】《命运2》邪姬魅影豪华版 68 光陨之秋豪华版 263
- 全球新动态:游民星空网络游戏_游民星空网
- 小学学校工作总结汇报5篇
- 【环球时快讯】员工岗位职责管理制度范本_员工岗位职责管理制度
- 聂荣臻的生平简介
- 法拉利的标志是长什么样_法拉利的标志是什么样的? 天天热点
- 我长大了400字作文5篇_每日速读
- 平安养老险厦门分公司:新春温暖走进社区,平安守护伴你同行|全球播资讯
- 全球观热点:湖南饮料自动售货机联系方式_湖南饮水机
- 关于春天的对联大全
- 泪光闪烁歌词_歌曲泪光闪烁c词-天天微动态
- 影响用英文怎么说
- 钠电正极材料生产商启钠新能源完成数千万元天使轮融资-环球观速讯
- 妇女节送妈妈什么
- 送老人送什么花
- 感恩答谢会演讲稿
- 邮储银行拟定增募不超450亿获通过 中金中邮证券建功 全球时讯
- 明德生物:有移动方舱PCR实验室 气膜实验室销售收入_焦点热讯
- Twitter 宣布再次推迟付费 API 上线时间:每月费用 100 美元|焦点滚动
- 周润发闺女_周润发干女儿|天天观天下
- 演员的诞生任嘉伦_演员的诞生-环球微动态
- 爱因斯坦的发明 最新
- 广西经贸职业技术学院《网络营销》课程入选2022年国家精品在线开放课程
- 龙卷风分级
- 纷纷曝出恋情!事业上升期,继任豪之后,夏之光与钟丽丽曝出恋情
- 数读|年轻人为黄金“上头” 5克以下转运珠、首饰受追捧-每日速看
- 丰田新任 CEO 佐藤浩司:将专注于雷克萨斯品牌,增加电动汽车产量 环球快看点
- 港股异动 | 海螺水泥(00914)涨超5%领涨水泥股 地产销售改善及基建高增速将带动水泥需求
- 超2万亿流动性集中到期,什么信号 环球实时
- ITIL运维流程管理与CIO-全球快看
- 贵州威宁:牛市供销两旺_世界今头条
- 环球热消息:亚太最美100张面孔,《创3》5人上榜排名最高,《青你2》戴萌夺冠
- 怎么查有没有被拘留-报资讯
- 对标特斯拉Model Y!长安深蓝S7实车曝光 外观抢眼-环球时讯
- 护眼小常识_眼睛的重要性
- 姐姐过生日送什么礼物
- 今日报丨qq飞车手游礼物盒返场
- 广州足协U15假球案被罚 下属球队比赛用“广东”贴纸覆盖“广州”
- 亚洲室内田径锦标赛首日 中国获1金1银1铜 视讯
- 梅西、姆巴佩、本泽马入选国际足联年度最佳男球员候选名单
- DNF:终极猎龙套,全服仅1人敢穿,你敢尝试吗? 焦点简讯
- 航天基因ECMO发布,性能优更便宜『航天视窗』(406)|焦点消息
- 武汉牙科医院哪家最好的医院 武汉牙科医院排行榜-当前热点
- 世界新资讯:骆明:反对足协对中超数量缩编,每年变来变去不是笑话吗?
- 中国地方游戏网下载_关于中国地方游戏网下载的介绍_世界看热讯
- 市场监管总局:我国个体工商户跃上1亿户的大台阶-世界热文
- 世界观速讯丨如何提高网站原创文章的质量的问题
- 共建成渝地区双城经济圈 今年将推进248个重大项目 环球热头条
- 【环球聚看点】Mysteel晚餐:钢厂盈利率不到四成,1月新增社融超预期
- 万丰奥威:万丰镁瑞丁生产基地主要在美国、加拿大、英国、墨西哥、中国上海和新昌 为特斯拉全球一级供应商|每日报道
- 全球新资讯:有一个人叫周杰伦,有一种歌叫 有一个人叫周杰伦
- 世界今日报丨旅游服务质量保证金补足期限延至2024年3月31日
- 扎导暂不回归DC!称非常满意新宇宙规划,已和滚导达成联系
- 呼和浩特迎春雪 民众享雪趣
- 超级兔子好用不_超级兔子怎么样
- 工作服常见面料及特性有哪些图片_工作服常见面料及特性有哪些
- 中国男女排新年首练从军训开始
- 积的乘方的概念是什么|速讯
- 环球热头条丨uv是什么意思_说一说uv是什么意思的简介
- 笔记本无线网络连接不上信号满格_笔记本无线网络连接不上
- 2023东莞个税退钱退到哪里?
- 三个字的港台女歌手_台湾女歌手 3个字
- 世界快看点丨汽车新消息:smart Vision EQ亮相赌城 人车间可沟通
- 热推荐:送男老师什么礼物,送Ta这些来神助攻
- 全球热门:2012年是什么生肖年
- 世界快消息!政府行政单位级别划分_行政单位级别划分
- 今天最新消息 香港回归25周年香港维园设“庆回归”大型装置 吸引市民拍照留念
- 斗战神 知北游_《斗战神》新版“知北游”任务说明心得
- 【时快讯】微信怎么设置自动回复教程_微信能不能设置自动回复消息
- 当前观察:蔡卓宜年龄身高个人简介 介绍蔡卓宜
- 怎样才能有支付宝账户_怎么办支付宝账户
- 天天消息!显示器开机显示无信号_开机后显示器无信号该怎么办
- 全球时讯:白兰氏鸡精大陆为啥禁卖_白兰氏鸡精
- 【天天热闻】三板申购是什么意思新三板怎么申购?一文带你读懂
- 酉时是几点到几点钟_卯时是几点到几点钟|新视野
- 环球观热点:56个民族拧成一股绳_56个名族
- 适合7月份旅游的地方有哪些推荐
- 使用驻车制动器制动什么意思_驻车制动器什么意思_世界热点
- 红烧土豆做法大全家常
- 很a很飒什么意思_很a
- 焦点短讯!广东湛江警方:男子持刀伤害女子致其死亡,已投案自首
- 三大赚钱的环保创业项目 全球聚看点
- 世界微头条丨怎么正确使用暖手鼠标垫子_怎么正确使用暖手鼠标垫
- 日本林内地暖_日本为什么禁止地暖 环球视讯
- 中秋节主题活动方案【五篇】 环球快讯
- 360随身wifi怎样使用_360随身wifi如何设置
- 新冠乙类乙管一个月了 环球新动态
- 企业家必看:如何让用户心甘情愿的掏钱?_环球热点评
- 世界讯息:80后个性婚礼策划方案
- 无卡就医购药,立“码”搞定!你为家人申领医保电子凭证了吗? 世界视点
- 当前报道:上海机场董秘回复:为了增强公司非航业务板块竞争优势,积极主动顺应国内免税旅游行业发展趋势
- 每日热讯!酒驾撞死人最低判刑多少年
- 【天天新视野】steam怎么注册电子邮箱收不到_steam怎么注册电子邮箱
X 关闭
行业规章
X 关闭