预处理指令用法详解(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即可一键实现上述效果,不必冗杂的代码,但仅限于自己写的头文件,标准库的头文件已经帮你加完了。
感谢您的阅读与耐心~
标签: 编程算法
- QoderWork上线“意识“功能:让AI学会记忆、反思和成长-每日消息
- 港股异动 | 中煤能源(01898)跌近3% 前5个月商品煤销量同比下降8.1% 机构预期未...
- USDA维持2026/27年度豆粕产量6502.5万短吨-热门看点
- 每日头条!潮宏基2025年净利4.97亿增长156.66% 董事长薪酬330.09万 今年一季报净利2.64亿续增
- 每日精选:和讯李景峰:机构资金开始加仓了!
- 中山市先觉智能科技有限公司成立 注册资本10万人民币
- 焦点讯息:西部牧业:截至6月10日公司的股东总数为1.51万户
- 6月15日科创创业ETF嘉实基金份额减少1200万份,重仓股宁德时代、中际旭创、新易盛
- 康臣药业(01681.HK)发布公告,于2026年6月15日斥资226.39万港元回购16.8万股 每日热讯
- 南通启涛再生资源有限公司成立 注册资本1000万人民币|每日快看
- 【独家焦点】海尔智家获得实用新型专利授权:“空调内机结构及空调器”
- 生意社玻璃6月15日均差继续负向扩大为-0.15元/平方米 微头条
- 生意社氧化镨6月15日均线下穿 均差为-500.00元/吨 动态
- 观天下!生意社碳酸锂-电池级6月15日均差继续负向缩小为-3450.00元/吨
- 每日消息!报告:今年夏令快消品或总体温和增长
- 今日这些个股异动 主力加仓电子、通信板块
- 新华视点丨各地积极推进绿色低碳发展
- 要闻:不用远行!临沂大峡谷漂流,山东人的夏日玩水后花园
- 2026年“春招”共提供超1268万个岗位 每日热点
- 一节课没上就要扣45%学费?驾校退费,怎样才合理
- 百事通!国家金融监督管理总局临汾监管分局核准景泽平洪洞洪都村镇银行副行长、董...
- 热点评!港股异动 | 东岳集团(00189)涨超7% 制冷剂市场供需偏紧 价格大涨30%创近十年新高
- 汉口银行行长毛锋任职资格获批
- 高考刚结束,综评即刻开考!学霸齐聚南大上演“巅峰对决”|焦点报道
- 【独家】露笑科技:公司董事辞职
- 生意社氧化镝6月14日均差为25750.00元/吨 由正向扩大转为缩小
- 快看:电光科技:拟定增募资不超14亿元 用于数据中心项目等
- 微动态丨开封走失男童搜救持续:河道水位下降,救援队正下河搜寻
- 前沿资讯!生意社炭黑6月13日均差为193.50元/吨 由正向扩大转为缩小
- 疯狂的蛋价:飙涨直逼猪肉 10年同期最高!有平台不到一个月涨超196%
- QoderWork上线“意识“功能:让AI学会记忆
- 港股异动 | 中煤能源(01898)跌近3% 前5
- USDA维持2026/27年度豆粕产量6502.5万短吨-
- 每日头条!潮宏基2025年净利4.97亿增长156.6
- 每日精选:和讯李景峰:机构资金开始加仓了
- 中山市先觉智能科技有限公司成立 注册资本
- 焦点讯息:西部牧业:截至6月10日公司的股
- 6月15日科创创业ETF嘉实基金份额减少1200万
- 康臣药业(01681.HK)发布公告,于2026年6月1
- 南通启涛再生资源有限公司成立 注册资本10
- 【独家焦点】海尔智家获得实用新型专利授权
- 生意社玻璃6月15日均差继续负向扩大为-0.15
- 生意社氧化镨6月15日均线下穿 均差为-500.
- 观天下!生意社碳酸锂-电池级6月15日均差继
- 每日消息!报告:今年夏令快消品或总体温和
- 今日这些个股异动 主力加仓电子、通信板块
- 新华视点丨各地积极推进绿色低碳发展
- 要闻:不用远行!临沂大峡谷漂流,山东人的
- 2026年“春招”共提供超1268万个岗位 每日热点
- 一节课没上就要扣45%学费?驾校退费,怎样
- 百事通!国家金融监督管理总局临汾监管分局
- 热点评!港股异动 | 东岳集团(00189)涨超
- 汉口银行行长毛锋任职资格获批
- 高考刚结束,综评即刻开考!学霸齐聚南大上
- 【独家】露笑科技:公司董事辞职
- 生意社氧化镝6月14日均差为25750.00元/吨
- 快看:电光科技:拟定增募资不超14亿元 用
- 微动态丨开封走失男童搜救持续:河道水位下
- 前沿资讯!生意社炭黑6月13日均差为193.50元
- 疯狂的蛋价:飙涨直逼猪肉 10年同期最高!











