预处理详解(一) -- 预定义符号与#define定义

目录

  • 一. 预定义符号
  • 二. #define
    • 1.#define定义常量
    • 2.#define定义宏
      • 3.带有副作用的宏参数
      • 4.宏替换的规则
      • 5.宏和函数的对比

在这里插入图片描述

一. 预定义符号

%s _ _FILE_ _ //文件
%s _ _ DATE_ _ //日期
%s _ _ TIME_ _ //时间
%d _ _ LINE_ _ //行号
%d _ _ STDC_ _ //如果编译器支持 ANSI C,那么该值为1,
//否则未定义

在这里插入图片描述
在这里插入图片描述

二. #define

1.#define定义常量

define name stuff
#define定义常量在预处理阶段被替换成对应的内容(stuff)
// name:符号名
// stuff:符号内容

举个例子:

#define MAX 1000
#define reg registe
//使用reg 等同于使用 registe,还更为简洁
#define forever for(;;)
//初始化
//调整
//判断都可以省略不写
//但是判断不写,条件会恒为真,会造成死循环
int main()
{printf("%d\n", MAX);MAX直接被替换为1000return 0;
}

2.#define定义宏

#define name(parament-list) stuff
name:符号名
parament-list:是由逗号隔开的参数表,他们有可能出现在stuff中
stuff:符号内容 == 表达式
注意:
parament-list的左括号必须紧挨到name,不然parament-list会被识别为stuff中的内容

举个例子:

#define SQUARE(x) x*xint main()
{int a = 10;printf("%d\n",SQUARE(a));//100printf("%d\n",SQUARE(a+1));//21return 0;
}

这里的 x = 10,1010 = 100
**a+1是直接进行替换,是a+1
a+1 = 2*a + 1 = 21
注意:
宏替换时不要吝啬括号,尽量能加括号的就加括号
所以加括号可以避免符号运算中出现不可预料的结果
那么这题正确是:#define SQUARE(x) ((x) * (x))

3.带有副作用的宏参数

宏的参数带有副作用就可能出现不可预料的结果

a + 1;//没有副作用
a++;//具有副作用

MAX可以证明带有副作用的宏

#define MAX(a,b) ((a>b) ? (a) : (b))int main()
{int a = 1;int b = 2;int c = MAX(a++,b++);printf("%d %d %d",a,b,c);// a = 2 b = 4 c = 3return 0;
}

正确的写法:
在这里插入图片描述

4.宏替换的规则

1.在调用宏的时,首先对参数进行检查,检查是否有宏定义的符号,如果有,他们首先被替换
2.替换文本随后被插入到程序中原来文本的位置。
对于宏,参数名被他们的值所替换
3.最后再次对结果文件进行扫描,检查它是否还有#define定义的符号。如果是,就重复上述处理过程

注意:
1.宏参数和#define定义中可以出现其他#define定义的符号,但对于宏不能出现递归

#define MAX(a,MAX(2,3))//不是递归,是MAX的参数
#define MAX(x,y) MAX(x,y)//不能出现递归
//宏的内部调用了宏(表达式部分调用了宏)

2.当预处理器搜索#define出现的符号时,字符串常量并不被搜索

#define M 10
#define MAX(a,b) ((a>b) ? (a) : (b))
MAX(M,2);//M会被替换成10printf("M = %d");//字符串常量不会被替换

5.宏和函数的对比

1.宏的优点:
通常被用于简单的运算
执行一条和函数有同样功能的语句,速度快,效率高
宏只有执行运算的时间,宏不存在内存的栈区静态区堆区,宏是不占用内存空间的
宏的参数无类型,所以宏可以进行任何类型的计算,是直接进行替换的
宏的参数可以出现类型:

#define MALLOC(num, type)\  // \为续行符,可以连接下一行
(type)malloc(num*sizeof(type))
...
//使⽤
MALLOC(10, int); //类型作为参数
//预处理器替换之后:
(int)malloc(10*sizeof(int));

2.宏的缺点:
宏会增加代码的长度,宏不能进行递归等等
3. 函数的优点:
函数会将值算好,才传参过去
在这里插入图片描述
4.函数的缺点:
函数的执行操作比较复杂,在反汇编中执行长度比较长
函数只能求特定类型的大小的运算等等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vmware下减小Ubuntu系统占用系统盘大小

1、虚拟机设置下占用空间 如图,给虚拟机分配了120GB,已经占用116.9GB,开机会提示空间不足。 2、实际使用空间 ubuntu系统下使用“df -h”命令查看实际使用空间大小50GB左右 造成这个原因是,虚拟机的bug:在虚拟机的ub…

算法学习——LeetCode力扣动态规划篇6

算法学习——LeetCode力扣动态规划篇6 121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣(LeetCode) 描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&…

ADC--数模转换器的使用

目录 前言 ADC接口使用 配置准备 确定引脚编号 光敏电阻--PF7​编辑 ADC3_IN5 开始配置 实验进阶 MQ_3--酒精传感器、水位传感器、火焰传感器 前言 ADC(analog-digital conversion)顾名思义模拟数字转换器,把外界的譬如温度、湿度、酒精含量、水位、特殊光波等等的现实…

突破编程_C++_网络编程(OSI 七层模型(网络层))

1 网络层的功能与作用 1.1 功能与作用详解 OSI 网络层是 OSI 参考模型中的第三层,位于数据链路层和应用层之间,其主要功能与作用涉及到网络中的数据通信和端到端的连接服务。其详细的功能与作用如下: 路由选择与分组交换:网络层…

通过PandasAI使用自然语言进行数据分析

通过PandasAI使用自然语言进行数据分析 介绍 ​ PandasAI是一个Python库,可以很容易地用自然语言向数据提问。它可以帮助您使用生成人工智能来探索、清理和分析数据。 使用PandasAI 这里使用Anaconda和Jupyter使用PandasAI 进入一个文件目录 创建一个 Notebook …

道可云元宇宙每日资讯|元宇宙标准化工作组成立大会召开

道可云元宇宙每日简报(2024年3月28日)讯,今日元宇宙新鲜事有: 元宇宙标准化工作组成立大会召开 3月21日,元宇宙标准化工作组成立大会暨第一次全体委员会议在浙江省丽水市青田县召开。元宇宙标准化工作组的建立&#…

阿里云服务器初始化简记

文章目录 推荐版本CPU、内存、硬盘视活动而定,一般活动价99元一年注意带宽云服务器具体设置建议系统推荐CentOS 7.9本地系统推荐MacOSiTerm2本地系统推荐Win11Linux子系统推荐开发环境NginxPythonMySQL 机器和系统基本状况测试网速设置Vim显示中文其他系统状态监控和…

Python | Leetcode Python题解之第2题两数相加

题目: 题解: # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optiona…

仓库规划csp

满分代码&#xff08;直接暴力&#xff09; #include<iostream> using namespace std; const int M11; const int N1001; int n,m; int a[N][M]; bool isfather(int x,int y)//y是否是x的上级仓库 {for(int i1;i<m;i){if(a[x][i]>a[y][i])return false;}return …

LabVIEW无人机大气数据智能测试系统

LabVIEW无人机大气数据智能测试系统 随着无人机技术的迅速发展&#xff0c;大气数据计算机作为重要的机载设备&#xff0c;在确保飞行安全性方面发挥着重要作用。设计了一套基于LabVIEW的无人机大气数据智能测试系统&#xff0c;通过高效、稳定的性能测试&#xff0c;及时发现…

统计XML文件内标签的种类和其数量及将xml格式转换为yolov5所需的txt格式

1、统计XML文件内标签的种类和其数量 对于自己标注的数据集&#xff0c;需在标注完成后需要对标注好的XML文件校验&#xff0c;下面是代码&#xff0c;只需将SrcDir换成需要统计的xml的文件夹即可。 import os from tqdm import tqdm import xml.dom.minidomdef ReadXml(File…

图像缩放算法双立方插值法

双立方插值法&#xff08;Bicubic Interpolation&#xff09;是一种常用的图像缩放算法&#xff0c;它通过对原始图像中的像素进行加权平均来计算目标图像中的像素值。相比双线性插值&#xff0c;双立方插值能更好地保留图像的细节和平滑过渡效果。 具体实现步骤如下&#xff…

Vue路由导航守卫

一、什么是Vue路由导航守卫&#xff1f; Vue路由导航守卫是Vue Router提供的一种机制&#xff0c;它可以让你在路由跳转之前或之后执行一些自定义逻辑&#xff0c;例如&#xff1a;鉴权、重定向等。守卫分为全局守卫、路由独享守卫和组件内守卫。 二、全局守卫 全局守卫作用…

Jenkins执行策略(图文讲解)

Jenkins执行策略-图文讲解 一&#xff1a;手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…

nginx编译安装详细说明

前言 在 CentOS 7 上编译安装 Nginx 1.24.0 &#xff0c;您可以按照以下步骤进行操作。 一、编译前准备 1.1、下载Nginx源代码 下载 Nginx 1.24.0 的源代码压缩包&#xff0c;并解压缩&#xff1a; 访问Nginx官网&#xff08;http://nginx.org/&#xff09;&#xff0c;找…

Kubeflow文档1:介绍与架构

Kubeflow 2024/3/19版本的文档 此专栏用来展示相关的内容翻译&#xff0c;重点关注本地部署&#xff0c;关于运营商的方案&#xff0c;请自行查阅 文档地址https://www.kubeflow.org/docs/ 开始编辑时间&#xff1a;2024/3/27&#xff1b;最后编辑时间2024/3/27 Kubeflow文…

毕设论文目录设置

添加目录 选择一种格式的自动目录 更新目录 发现该目录中只有1、2章&#xff0c;3、4章 然后再点击更新目录 对应的&#xff0c;小标题添加二级目录

数据库之MyBatisPlus详解

MyBatisPlus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官网地址&#xff1a;https://baomidou.com/ 一、入门案…

C++学习随笔(8)——模板初阶

本章我们来学习一下C的模版部分&#xff01; 目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.1 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1. 泛型编程 如何实现一个通…

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中&#xff0c;文件上传是一项常见的功能需求&#xff0c;用于允许用户向服务器提交文件&#xff0c;如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言&#xff0c;提供了方便且高效的方式来处理文件上传操作。其中&#xff0c;r.F…