当前位置:首页  >  行业资讯  > 正文

今日观点!预处理指令用法详解(C语言)

今日观点!预处理指令用法详解(C语言)
2023-02-15 13:08:56 来源:腾讯云

前言

使编译器执行预处理操作的代码被称为预处理指令,本文介绍常见的预处理指令的实际用法。

一、预处理符号

预处理符号是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宏定义删除,可以在函数内部使用!
#

被删除后的标识就不能再使用了。

四、命令行编译

指在VScodeLinux等用命令行执行编译的环境下,可以在编译时对变量进行赋值。

五、条件编译

在写程序时,有些代码是为了查看某个部分是否正确而写的的调试代码。

删除很可惜,但又不想让其编译,此时就可以使用选择性编译

但实质上使用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即可一键实现上述效果,不必冗杂的代码,但仅限于自己写的头文件,标准库的头文件已经帮你加完了。

感谢您的阅读与耐心~

标签: 编程算法

(责任编辑:news01)
今日观点!预处理指令用法详解(C语言)

今日观点!预处理指令用法详解(C语言)

使编译器执行预处理操作的代码被称为预处理指令,本文介绍常见的预处理指令的实际用法。
02-15 13:08:56
要闻速递:唐山:精准推送岗位 服务贴心到位

要闻速递:唐山:精准推送岗位 服务贴心到位

唐山:精准推送岗位服务贴心到位
02-15 11:16:18
脚后跟干裂什么原因

脚后跟干裂什么原因

脚后跟干裂,大家可以说是非常熟悉的。那脚后跟干裂是什么原因引起的?知道脚后跟干裂又应该怎么办?下面...
02-15 09:55:49
全球观天下!掸读音的组词

全球观天下!掸读音的组词

1、掸子2、掸瓶3、掸软4、掸援5、掸残6、动掸7、掸掸8、掸尘本文关于掸读音的组词,关于掸读音的组词简...
02-15 09:56:25
超20%非亲生!人间真相上演?DNA鉴定师感叹:男人真是弱势群体

超20%非亲生!人间真相上演?DNA鉴定师感叹:男人真是弱势群体

“父亲呢?孩子的父亲没来怎么做鉴定?”某天,DNA亲子鉴定师邓亚军一脸狐疑地看着眼前的一家四口:外公...
02-15 07:59:24
每日播报!新学期开学典礼致辞最新8篇

每日播报!新学期开学典礼致辞最新8篇

要想不让目标落空,更重要的是要一丝不苟地去执行自己制订的计划,这需要我们有持之以恒的精神,不能半...
02-15 05:38:52
天天观热点:开普勒计划游戏_开普勒计划

天天观热点:开普勒计划游戏_开普勒计划

1、开普勒任务(KeplerMission)是美国国家航空航天局设计来发现环绕着其他恒星之类地行星的太空望远镜。2、使
02-15 04:48:27
环球热文:生化危机6电影简介

环球热文:生化危机6电影简介

《生化危机:终章》是《生化危机》系列电影的第六部,下面是学习啦小编给大家整理的生化危机6电影简介,...
02-15 01:43:43
【天天新视野】山东寿光宏安路桥有限公司

【天天新视野】山东寿光宏安路桥有限公司

1、山东寿光宏安路桥有限公司于2002年04月29日在寿光市市场监督管理局登记成立。2、法定代表人朱学森,...
02-15 01:04:34
世界最新:比较级和最高级的基本用法

世界最新:比较级和最高级的基本用法

比较级和最高级,是英语语法中常用的一种语法,有一般比较级和特殊比较级等分类。以下是由学习啦小编整...
02-14 22:13:06
【天天新要闻】深圳两会定目标:今年新增“境内外上市公司40家”!如何实现?关键是中小企业用好资本市场平台

【天天新要闻】深圳两会定目标:今年新增“境内外上市公司40家”!如何实现?关键是中小企业用好资本市场平台

2023年,要新增境内外上市公司40家、国家级专精特新“小巨人”企业100家、国家高新技术企业1000家、独角...
02-14 21:44:22
环球即时看!2023太原人才补贴标准

环球即时看!2023太原人才补贴标准

补助(贴)标准(一)生活补助:博士研究生、硕士研究生、本科生每月分别为5000元、3000元、1500元,补贴...
02-14 19:05:31
奉献的演讲稿

奉献的演讲稿

精选奉献的演讲稿四篇演讲稿在写作上具有一定的格式要求。在社会一步步向前发展的今天,能够利用到演讲...
02-14 18:03:25
全球视讯!2023张韶涵寓言世界巡回演唱会苏州站门票价格(附开票时间)

全球视讯!2023张韶涵寓言世界巡回演唱会苏州站门票价格(附开票时间)

张韶涵寓言世界巡回演唱会苏州站门票价格(附开票时间)张韶涵苏州演唱会门票价格:388元 488元 588元...
02-14 17:08:25
弯弯藤上结掌叶圆圆明珠叶上结打一水果两个字_弯弯

弯弯藤上结掌叶圆圆明珠叶上结打一水果两个字_弯弯

1、拼音弯弯:2、弯弯[wnwn]3、电话号码弯弯:4、第一弯wn的音是一,第二弯wn的音也是一。5、弯弯的解释:6、
02-14 15:57:46
即时:陶渊明移居二首_陶渊明移居

即时:陶渊明移居二首_陶渊明移居

1、陶渊明生于公元365年,一名潜,字元亮,寻阳柴桑(今江西九江)人。2、他生活在东晋后期,这时政治黑...
02-14 14:03:13
运动会赞词

运动会赞词

运动会赞词各位运动健儿们在绿荫场上的成绩是由他们努力奋斗得来的。而旁边同学们的一声声呐喊,一双双...
02-14 14:00:56
每日视点!伊藤美诚夺冠,世界排名重回第5,孙颖莎陈梦王曼昱继续包揽前4!

每日视点!伊藤美诚夺冠,世界排名重回第5,孙颖莎陈梦王曼昱继续包揽前4!

乒乓球友您好,我是乒谈。北京时间2月14日,国际乒联更新了最新一期的世界排名。因为上一周刚结束WTT约...
02-14 11:51:02
当前焦点!广西南宁旭飞美术:这10所师范大学,考上就是“编制教师”!

当前焦点!广西南宁旭飞美术:这10所师范大学,考上就是“编制教师”!

有很多人想考教师,尤其是女孩子!考个教师编,稳定、待遇好、两大假期、容易找对象,好多好多。但很多...
02-14 09:52:39
焦点资讯:给60岁老人送什么生日礼物好

焦点资讯:给60岁老人送什么生日礼物好

老人过生日,一般都是送礼物比较喜欢实用的礼物,如皮带,皮带,钱包,打火机,保健礼物等等,如果老人...
02-14 08:26:34
环球快看点丨在哪里买机票最便宜 多数人都是选择这几个渠道

环球快看点丨在哪里买机票最便宜 多数人都是选择这几个渠道

自从飞机的出现,现在人们的出行越来越便利了,好多人外出旅游或者是出差都是选择乘坐飞机,给大家节省...
02-14 08:11:09
3

3

1https: t bilibili com 756834376607596569?tab=22https: t bilibili com 755847607872389126?tab=23https: t bilibili com 7560860429839
02-14 04:51:10
世界今日报丨武昌鱼怎么做好吃

世界今日报丨武昌鱼怎么做好吃

武昌鱼怎么做好吃,用料:武昌鱼1条、干辣椒2个、料酒10克、葱10克、蒜末8克、姜7克。武昌鱼打花刀;锅...
02-14 04:21:58
全球讯息:尼坤最近推特上发关于宋茜_尼坤微博提到宋茜

全球讯息:尼坤最近推特上发关于宋茜_尼坤微博提到宋茜

1、2013年04月18日尼坤关注宋茜新浪微博纪念日,百度百科上有的,话说你是维尼饭么~我告诉你个小秘密好...
02-14 00:39:26
我在时间尽头等你等你演员表

我在时间尽头等你等你演员表

我在时间尽头等你等你演员表,1、《我在时间尽头等你》是由姚婷婷执导,刘迟、郑执、浦贤、杨同坤、姚婷...
02-14 00:26:49
当前速看:美国纽约再次经历“血腥周末”:多地发生枪击案 至少2死9伤

当前速看:美国纽约再次经历“血腥周末”:多地发生枪击案 至少2死9伤

美国纽约再次经历“血腥周末”:多地发生枪击案至少2死9伤,美国,枪击案,纽约市,枪击事件,暴力事件,全国...
02-13 21:04:25
文天祥代表作

文天祥代表作

文天祥代表作,文天祥代表作如下:1、《过零丁洋》:宋代大臣文天祥在1279年经过零丁洋时所作的诗作。表...
02-13 20:13:12
全球热推荐:gionee f100s_gionee

全球热推荐:gionee f100s_gionee

1、第一步:首先使用金立ELIFES5 1下载天天动听软件,可以用豌豆荚安装  第二步:可以在天天动听里面...
02-13 19:01:22
“在上海1000万资产是穷人家庭”?董承非发言引争议,公司回应:断章取义!

“在上海1000万资产是穷人家庭”?董承非发言引争议,公司回应:断章取义!

“在上海1000万资产是穷人家庭”?董承非发言引争议,公司回应:断章取义!,私募,a股,港股,董承非,成长...
02-13 17:02:37
全球今热点:川大智胜:公司未涉及信创方面业务

全球今热点:川大智胜:公司未涉及信创方面业务

每经AI快讯,有投资者在投资者互动平台提问:尊敬的董秘您好!请问公司有无间接参与信创产业领域?川大...
02-13 15:39:29

精彩推送