【C语言】预处理超级详细解析
前言:
作者简介:爱吃大白菜1132
人生格言:纸上得来终觉浅,绝知此事要躬行
如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!
如果觉得博主文章还不错的话,希望三连支持!
目录
1.预处理符号
2.#define
#define 定义标识符
#define 定义宏
#define 替换规则
3.宏定义中的#和##号的区别
#的作用
##的作用
4.条件编译
1.预处理符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
以上预定义符号都是C语言内置的。
2.#define
#define 定义标识符
语法:#define name stuff
例如:
#include <stdio.h>
#define MAX 10int main()
{printf("%d\n", MAX);//打印10return 0;
}
#define 定义宏
语法:#define name( parament-list ) stuff
注:
参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
#include <stdio.h>
#define SUM(a,b) (a)+(b)int main()
{printf("%d\n", SUM(2, 3));return 0;
}
注:
由于宏是通过替换完成的,所以操作符的优先级会影响宏的求值,应该尽量使用括号明确优先级。
#define 替换规则
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
1. 在调用宏时,首先对宏中参数进行检查,检查是否包含任何由#define定义的符号。如果有,它们首先被替换。
2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果有,就重复上述处理过程。
3.宏定义中的#和##号的区别
#的作用
加上#后进入宏定义,在预处理时,不会将其改变成参数,而是保留参数所对应的字符串。
#include <stdio.h>#define PRINT( VALUE,FORMAT) printf("the value of "#VALUE" is " FORMAT "\n", VALUE);
int main()
{int a = 3;PRINT(a,"%d");//预处理会替换为://printf("the value of a is %d\n", a);
}
##的作用
##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。
//FUC将c和h粘合到一起,相当于字符名ch
#include <stdio.h>#define FUC(A,B) A##Bint main()
{char ch[] = "hello world";printf("%s\n", FUC(c,h) );
}
4.条件编译
常见的条件编译指令:
1.#if 常量表达式//...#endif//常量表达式由预处理器求值。如:#define __DEBUG__ 1#if __DEBUG__//..#endif
2.多个分支的条件编译#if 常量表达式//...#elif 常量表达式//...#else//...#endif
3.判断是否被定义#if defined(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol
4.嵌套指令#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif#endif
小节:
一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是:
把宏名全部大写
函数名不要全部大写
【C语言】预处理超级详细解析相关推荐
- 超级详细解析——字模
超级详细解析--字模 一.简介 汉字库: 即存储汉字的仓库.现在常使用的汉字库有 HZK16.HZK24.HZK32...即对应的16*16.24*24.32*32汉字点阵字库.16X16点阵方式是最 ...
- c r语言中rank函数,R语言rank函数详细解析
R语言rank函数详细解析 发布于 2016-01-04 16:26:04 | 557 次阅读 | 评论: 0 | 来源: PHPERZ R 数据统计分析语言R是用于统计分析.绘图的语言和操作环境.R ...
- RHCSA 8考题超级详细解析(2022最新版)本人已过
文章目录 1.配置IP地址 2.配置软件仓库 3.调试SELinux 4.创建用户账户 5. 配置cron计划任务 6.创建共享目录 7.配置NTP时间客户端 8. auto自动挂载 9.配置文件权限 ...
- collection集合 多少钱_Java 集合(2)-- Iterator接口源码超级详细解析
一.iterator接口介绍 iterator接口,也是集合大家庭中的一员.和其他的Map和Collection接口不同,iterator 主要是为了方便遍历集合中的所有元素,用于迭代访问集合中的元素 ...
- TP、TN、FP、FN超级详细解析
以西瓜数据集为例,我们来详细解释一下什么是TP.TN.FP以及FN. 一.基础概念 TP:被模型预测为正类的正样本 TN:被模型预测为负类的负样本 FP:被模型预测为正类的负样本 FN:被模型预测为负 ...
- c语言 三子棋详细解析 (零基础也能看懂)附源码 c语言小游戏
代码运行结果如下 代码实现 test.c(测试游戏的逻辑) game.h(关于游戏相关的函数声明符号声明)头文件包含的 game.c游戏相关函数的实现 test.c 游戏如何玩 希望游戏玩完一把还可以 ...
- r语言rank降序_R语言rank函数详细解析
1.rank函数是什么 rank相关文档[1]可以译为"返回原数组(?)中各个元素排序(?)后的秩次(?)",表面上看确实可以得到次序,但对数组.排序.秩次交待不清. 2.rank ...
- SAP Memory ABAP Memory超级详细解析
以前做enhancement的时候用过parameter id 和 memory id, 但很多其他语法用法我是没接触过的, 今天看了Palm同鞋做的文档SAP Memory & ABAP M ...
- 7-36 复数四则运算 (15分)【超级详细解析】
#include <stdio.h> #include <math.h>double a1,b1,a2,b2; //使用double,可以使小数之间的计算更加精确 double ...
最新文章
- 逆向工程 sql_mybatis逆向生成工具,真的很好用!
- kali锁屏后无法唤醒_面试官:说一下公平锁和非公平锁的区别?
- @EqualsAndHashCode()注解详解
- MAC-VBox-Centos6.6安装增强功能
- ajax跨域访问问题
- OPPO小布助手算法系统探索、实践与思考
- 使用百度云AI C++SDK在windows上进行在线语音识别
- docker部署redis集群
- 12306GT多线程、分流免费抢票工具使用心德
- 还不快点刷面试题,史上最全Java工程师面试题汇总,全会月薪至少3W
- 云​大数据和计算技术周报(第43期)
- 广州大学数据库实验三——数据库系统设计综合实验
- Docker下运行Presto访问Redis及BI展示
- 优惠券有什么用,为什么不直接降价呢?
- 使用MIC进行变量选择
- 状态机在马蜂窝机票订单交易系统中的应用与优化实践
- 信息可视化的简单概述
- 团体程序设计天梯赛L2-023 图着色问题
- Cloudify 学习(四):通过Cloudify的蓝图来创建第一个deployment,由k8s生成这个容器-容器编排
- 十年前范雅各布森关于bufferbloat的讨论