预处理指令用法详解(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
即可一键实现上述效果,不必冗杂的代码,但仅限于自己写的头文件,标准库的头文件已经帮你加完了。
感谢您的阅读与耐心~
标签: 编程算法
责任编辑:hnmd003
相关阅读
-
快讯:中国平安鸿鑫04是什么保险?中国平安鸿鑫04保险责任主要是什么?
平安鸿鑫04是一款分红型的终身寿险,它的保险责任主要是身故保障。比如主险合同生效日起1年内疾病身故,...
2023-02-13 -
【环球播资讯】机构:2023年第7周,重点城市二手住宅成交量环比上涨27.26%
据诸葛研究院数据显示,2023年第7周监测重点城市新建商品住宅成交量环比上涨37 53%,二手住宅成交量环...
2023-02-13 -
【新视野】北京建工拟下调“20建工01”第4及第5年票面利率 现为3.20%
2月13日,北京建工集团有限责任公司发布2020年公开发行公司债券(第一期)(面向合格投资者)(品种一)...
2023-02-13 -
深圳市:鼓励存量土地和房屋、绿化用地、地下空间、建筑屋顶等兼容建设体育场地设施
中国网地产讯近日,深圳市文化广电旅游体育局、深圳市教育局印发《关于深化体教融合促进青少年健康发展...
2023-02-13 -
【热闻】广州高新区投资集团上限10亿融资券申购区间为2.30%-2.98%
观点网讯。2月13日,据上清所披露,广州高新区投资集团有限公司2023年度第一期超短期融资券申购说明,本...
2023-02-13 -
房贷可贷到80岁?南宁:真的!还没还完,人就离世了怎么办?律师说......
继买房补贴、多代人公积金账户共同还贷、二手房带押过户等政策之后,又出现了延长按揭贷款期限至80岁的...
2023-02-13 -
快讯:中国平安鸿鑫04是什么保险?中国平安鸿鑫04保险责任主要是什么?
平安鸿鑫04是一款分红型的终身寿险,它的保险责任主要是身故保障。比如主险合同生效日起1年内疾病身故,...
2023-02-13 -
今日热闻!手机摄像头怎么当电脑摄像头?手机摄像头当电脑摄像头方法是什么?
1、使用USB数据线将电脑连接上手机摄像头,usb数据线将电脑与手机连接,实现手机当电脑摄像头是大家最常...
2023-02-13
阅读排行
资讯播报
- 全球速讯:上网有哪几种方式?上...
- 世界百事通!《成都》你喜欢听吗...
- 热推荐:驾驶证档案编号如何查询...
- 每日热议!冬至将至的暖心语句有...
- 广发信用卡积分有什么规则?广发...
- 【天天播资讯】QQ情侣空间怎么开...
- 环球视点!DNF账号金库有什么用...
- 原著小说《赘婿》宁毅一共有几个...
- 关注:李时珍你了解吗?李时珍的...
- 环球速看:用支付宝转账可以用信...
- 今日热议:张伯伦在NBA中效力过...
- 堪萨斯城酋长获超级碗冠军:马霍...
- 每日关注!【开好局 起好步】江...
- 世界最新:“地铁时代云上城”未...
- 天天亮点!【开好局 起好步】江...
- 热推荐:重庆交通开投集团40亿元...
- “我们期盼中国游客回来”——老...
- 计划今年发射,将与天宫空间站共...
- 世界快资讯:大数据看奋进的中国...
- 天天关注:哥哥生日送什么礼物合适
- 天天即时看!爱琴海集团:新春三...
- 创造历史后,吴易昺说“这是中国...
- 天天热资讯!中国中免成立天津商...
- 天天报道:2023世界男排联赛赛程...
- 金能电力获批设立博士后创新实践...
- 【聚看点】陕国投A转让广州华欣...
- 世界视讯!合肥肥西上派镇1.15亿...
- 官方暂时没有明确通知发布 2023...
- 限定使用和处置权利 郑州市已确...
- 省内和跨省异地就医直接结算如何...
- 创中国电竞历史!李培楠这个星际...
- 外地医保在郑州就医备案需满足哪...
- 全球视讯!民进昆明市委建议存量...
- 太和控股:附属公司遭诉讼索赔 ...
- 新消息丨cdr提示非法软件您的产...
- 外地医保在郑州看病须遵循哪些原...
- “一手交钱一手交房”,现房销售...
- 郑州公租房上小学不参与划片 郑...
- Glynn轻奢女装品牌故事与2023春...
- 南宁房贷年龄期限可延长至80岁
- 天天要闻:中国男选手首夺ATP巡...
- 2023欧悦优选双核生态高峰论坛盛...
- 世界快资讯:吴易昺ATP250巡回赛...
- 是多媒体技术中最基本的组成部分...
- 短道速滑世界杯林孝埈蝉联金牌 ...
- “聊天记录删 最近查得严” 这...
- 观焦点:新房供求均创近年新低 ...
- 今日聚焦!短道世界杯多德雷赫特...
- 快看点丨万科转道A股增发150亿元...
- 塞浦路斯前外长赫里斯托祖利季斯...
- 视焦点讯!中央广播电视总台五集...
- 前沿热点:新能源汽车动力电池安...
- 【独家】甘肃一季度重大项目集中...
- 世界热门:《齐民要术》分明就是...
- 报告显示:到2025年我国冰雪产业...
- 环球简讯:万科A股拟定增募资150...
- 新赛季中超大概率重邀“洋哨”
- 世界微速讯:“接力贷”重出江湖...
- 世界微速讯:林孝埈:等待与归来
- 笔记本电脑无线网卡分为几种类型...
- 汉译为薄膜场效应晶体管 tft屏...
- 环球即时看!卫星瞰高质量发展 ...
- 全球热门:重庆体彩国象队斩获202...
- 焦点要闻:我国以“三提升”“两...
- 惠州博罗:“1+5+7”同步发力...
- 全球头条:【一线调研】“飞”出...
- 热头条丨完善县乡村三级医疗服务...
- 世界快资讯:2022年度全国越冬鹤...
- 即时:【开好局 起好步】山西:...
- 精彩看点:吴易昺闯入巡回赛决赛...
- 中国男篮上海集训:新主帅、新球...
- 【天天热闻】“人民科学家”国家...
- 第十三届全国名校EMBA网球精英赛...
- 今热点:击败利雅得新月,皇马第...
- 养多肉,摘些柳枝带回家,跟着学...
- 永久场馆赛后利用率达100% 冬奥...
- 通讯!独立性跃升,物业服务本质...
- 天天观焦点:前国安主帅扎切罗尼...
- 每日聚焦:中国排球掀起“留洋潮...
- 环球即时:“迎亚运”中国体育艺...
- 焦点速看:华为mate305G如何关闭...
- 得有多大勇气,才敢买东风雪铁龙...
- 全球观天下!我们的生活走出疫情...
- 消费热潮涌动 为中国经济复苏开好头
- 卫星瞰高质量发展 | 一片荒滩起新城
- 【环球速看料】新华全媒+丨从厂...
- 以契合为引,用共创破局,“刚刚...
- 天天快资讯丨【地评线】飞天网评...
- 世界速读:【地评线】金羊网评:...
- 全球最资讯丨建专班 查苗情 ...
- 俄罗斯中国小伙给女的送手机
- “激情冬奥 共创未来”奥运文化...
- 成为FIFA年度最佳候选,国际足联...
- 海贼王314_海贼王328
- 天天看热讯:中国青少年冰球的“...
- 时讯:甘肃省三八红旗手:从大山...
- 世界要闻:远洋集团位列无锡1月...
- 天天热推荐:光遇收到礼物通知
- 中国男网28年的漫长等待!吴易昺...
- 焦点速递!“青春力量”焕新非遗...