前言:

作者简介:爱吃大白菜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语言】预处理超级详细解析相关推荐

  1. 超级详细解析——字模

    超级详细解析--字模 一.简介 汉字库: 即存储汉字的仓库.现在常使用的汉字库有 HZK16.HZK24.HZK32...即对应的16*16.24*24.32*32汉字点阵字库.16X16点阵方式是最 ...

  2. c r语言中rank函数,R语言rank函数详细解析

    R语言rank函数详细解析 发布于 2016-01-04 16:26:04 | 557 次阅读 | 评论: 0 | 来源: PHPERZ R 数据统计分析语言R是用于统计分析.绘图的语言和操作环境.R ...

  3. RHCSA 8考题超级详细解析(2022最新版)本人已过

    文章目录 1.配置IP地址 2.配置软件仓库 3.调试SELinux 4.创建用户账户 5. 配置cron计划任务 6.创建共享目录 7.配置NTP时间客户端 8. auto自动挂载 9.配置文件权限 ...

  4. collection集合 多少钱_Java 集合(2)-- Iterator接口源码超级详细解析

    一.iterator接口介绍 iterator接口,也是集合大家庭中的一员.和其他的Map和Collection接口不同,iterator 主要是为了方便遍历集合中的所有元素,用于迭代访问集合中的元素 ...

  5. TP、TN、FP、FN超级详细解析

    以西瓜数据集为例,我们来详细解释一下什么是TP.TN.FP以及FN. 一.基础概念 TP:被模型预测为正类的正样本 TN:被模型预测为负类的负样本 FP:被模型预测为正类的负样本 FN:被模型预测为负 ...

  6. c语言 三子棋详细解析 (零基础也能看懂)附源码 c语言小游戏

    代码运行结果如下 代码实现 test.c(测试游戏的逻辑) game.h(关于游戏相关的函数声明符号声明)头文件包含的 game.c游戏相关函数的实现 test.c 游戏如何玩 希望游戏玩完一把还可以 ...

  7. r语言rank降序_R语言rank函数详细解析

    1.rank函数是什么 rank相关文档[1]可以译为"返回原数组(?)中各个元素排序(?)后的秩次(?)",表面上看确实可以得到次序,但对数组.排序.秩次交待不清. 2.rank ...

  8. SAP Memory ABAP Memory超级详细解析

    以前做enhancement的时候用过parameter id 和 memory id, 但很多其他语法用法我是没接触过的, 今天看了Palm同鞋做的文档SAP Memory & ABAP M ...

  9. 7-36 复数四则运算 (15分)【超级详细解析】

    #include <stdio.h> #include <math.h>double a1,b1,a2,b2; //使用double,可以使小数之间的计算更加精确 double ...

最新文章

  1. 逆向工程 sql_mybatis逆向生成工具,真的很好用!
  2. kali锁屏后无法唤醒_面试官:说一下公平锁和非公平锁的区别?
  3. @EqualsAndHashCode()注解详解
  4. MAC-VBox-Centos6.6安装增强功能
  5. ajax跨域访问问题
  6. OPPO小布助手算法系统探索、实践与思考
  7. 使用百度云AI C++SDK在windows上进行在线语音识别
  8. docker部署redis集群
  9. 12306GT多线程、分流免费抢票工具使用心德
  10. 还不快点刷面试题,史上最全Java工程师面试题汇总,全会月薪至少3W
  11. 云​大数据和计算技术周报(第43期)
  12. 广州大学数据库实验三——数据库系统设计综合实验
  13. Docker下运行Presto访问Redis及BI展示
  14. 优惠券有什么用,为什么不直接降价呢?
  15. 使用MIC进行变量选择
  16. 状态机在马蜂窝机票订单交易系统中的应用与优化实践
  17. 信息可视化的简单概述
  18. 团体程序设计天梯赛L2-023 图着色问题
  19. Cloudify 学习(四):通过Cloudify的蓝图来创建第一个deployment,由k8s生成这个容器-容器编排
  20. 十年前范雅各布森关于bufferbloat的讨论

热门文章

  1. cms后台利用更新模块压缩包getshell
  2. 从王者荣耀看设计模式(七.装饰者模式)
  3. 机器学习sklearn-KNN
  4. dup、dup2介绍
  5. 企业微信 微信开发者工具调试问题
  6. 仿小米,Cal日历的周月切换
  7. 彩世界导航教你如何在家自制机器人
  8. js e.offsetX 和 e.offsetY
  9. UNICODE字碼分佈表
  10. 关于Pytorch中双向LSTM的输出表示问题