实时

您的位置:首页>产品 >

世界讯息:预处理指令用法详解(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宏定义删除,可以在函数内部使用!
#

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

四、命令行编译

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

感谢您的阅读与耐心~

关键词: 编程算法

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

2023-02-15 08:11:48

我们可以把玩得最开心、印象最深刻的一次活动写下来。无论是一次活动,还是一起玩滑梯,以下是小编准备的那次玩得真高兴三年级作文400字左右范文

2023-02-15 07:40:38

预算10-15万元买家用轿车,相信以往大部分人会先考虑合资品牌,但是随着自主品牌百花齐放,而且市场年轻化,这些合资品牌家轿就显得有些大众化

2023-02-15 05:08:43

党的长久发展需要依靠群众的支持,人民群众是其发展的力量之源!那么,关于党的群众路线你了解多少呢?党的群众路线内涵是什么呢?下面就随学

2023-02-15 03:58:06

一宁静的街道,稀疏的行人。几辆车扑着灰尘行驶着,鸟鸣啾啾,树荫点点。李寸之左右张望,几乎忘记了自己出行的目的,直到书店出现在自己的眼

2023-02-15 01:03:20

2016年10月17日7点30分,神舟十一号载人飞船在酒泉卫星发射中心点火升空,将于2天后与天宫二号空间实验室牵手太空,景海鹏和陈冬开启中国航天

2023-02-14 23:54:08

格隆汇2月14日丨亦辰集团(08365 HK)公布,截至2022年12月31日止三个月,集团录得收益约20,300,000港元,同比增加约53 8%;集团录得亏

2023-02-14 22:00:03

愚人节活动策划方案(精选15篇)为有力保证事情或工作开展的水平质量,常常需要提前制定一份优秀的方案,一份好的方案一定会

2023-02-14 19:53:00

不好,你就应该好好努力把自己嫁做家,这不能空手,你可以选择自己动手做的,比如你家里的小时候需要的东西,比如说,你用钱送他

2023-02-14 19:13:38

一套新居,一套属于闺蜜,搬家送礼物,可谓是祝贺,乔迁新居送一套红厨具套家用品。其它的家居用品也很不错,像吸尘器、豆浆机

2023-02-14 17:22:32

我的弟弟作文精选10篇我的弟弟作文1世界上有好多游戏迷,他们看到电脑就要玩,玩起来没完没了,叫他干嘛,他总是说:“等候,

2023-02-14 15:50:21

解答:1、首先,检查手机信号是否良好。如果手机信号差,网络自然会变慢。如果手机信号好或者网络不好,可以在后台重新连接或者

2023-02-14 16:00:01

新型冠状病毒传播性强,不侥幸,不冒险,情谊常在,聚会不急一时。02月14日14时河南安阳昨日累计报告阳性感染者确诊582例怎么判断自己是否属于

2023-02-14 14:11:27

恒信贵金属简介恒信贵金属,全称恒信贵金属有限公司,注册成立于香港,是恒信集团旗下公司,集团资本金达20亿。恒信贵金属详情恒信贵金属简介

2023-02-14 11:59:11

保洁员劳务合同范本3篇新第1篇雇佣方(简称甲方):________身份证号码:________________________被雇佣方(简称乙方):_______身份证号码:

2023-02-14 11:50:37

法国呼吁该国公民立即离开白俄罗斯

2023-02-14 10:07:20

爱屋及乌是指爱一个人而连带地关心到跟他有关系的人或物。这 "推爱 "之深。由此又产生另一个近义词:屋乌之爱。而后古诗词中亦多

2023-02-14 09:01:51

送老师礼物,最重要的是你真心诚心诚的表达到,老师都会很开心的。送老师礼物一定要用心,能让老师感受到你的真心,送的礼物一定

2023-02-14 05:32:18

1、调:调弄,这里指弹(琴)。2、调(tiáo)素琴:弹奏不加装饰的琴。3、素琴:不加装饰的琴。4、可以调素琴,阅金经。

2023-02-14 05:16:40

enterbay是哪国的牌子,enterbay是中国的牌子。ENTERBAY于2005年在中国香港成立,并与2009年在香港开立首家旗舰店。作为世界领先的蜡像级人偶

2023-02-14 01:09:11