关于预处理的一系列问题

news2024/11/19 4:41:03

1. 预定义符号

C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。 

 

2. #define定义常量

#define name stuff  

 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反斜杠(续⾏ 符)。 而且不要;

3. #define定义宏

#define机制包括了⼀个规定,允许把参数替换到⽂本中,这种实现通常称为宏(macro)或定义宏 (definemacro)。 

#define name( parament-list ) stuff

其中的 parament-list 是⼀个由逗号隔开的符号表,它们可能出现在stuff中。

举个例子吧

#define SQUARE(x) ((x) * (x)) 这个其实就是求平方,我们在使用的时候要注意这是直接替换的,所有千万不要忘记加括号 

 4. 带有副作⽤的宏参数

当宏参数在宏的定义中出现超过⼀次的时候,如果参数带有副作⽤,那么你在使⽤这个宏的时候就可 能出现危险,导致不可预测的后果。副作⽤就是表达式求值的时候出现的永久性效果。 

举个例子

x+1;//不带副作⽤

x++;//带有副作⽤ 

这是怎么回事呢,我们不妨看看下面的代码

#define MAX(a, b) ( (a) > (b) ? (a) : (b) )

... x = 5;

y = 8;

z = MAX(x++, y++);

printf("x=%d y=%d z=%d\n", x, y, z);//输出的结果是什么? 

你会惊讶的发现输出的结果竟然不是xy中任意一个数,我们只需要把全部替换就能找到原因了 

5. 宏替换的规则

在程序中扩展#define定义符号和宏时,需要涉及⼏个步骤。

 1. 在调⽤宏时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。如果是,它们⾸先 被替换。

2. 替换⽂本随后被插⼊到程序中原来⽂本的位置。对于宏,参数名被他们的值所替换。

3. 最后,再次对结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上 述处理过程。 

注意:

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

2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

6. 宏函数的对⽐

和函数相⽐宏的劣势:

1. 每次使⽤宏的时候,⼀份宏定义的代码将插⼊到程序中。除⾮宏⽐较短,否则可能⼤幅度增加程序 的⻓度。

2. 宏是没法调试的。

3. 宏由于类型⽆关,也就不够严谨。

4. 宏可能会带来运算符优先级的问题,导致程容易出现错。 

 

7. #和##

#运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带参数的宏的替换列表中。

 #运算符所执⾏的操作可以理解为”字符串化“。 

#define PRINT(n) printf("the value of "#n " is %d", n);

若a使用进去结果为the value of a is 10

## 可以把位于它两边的符号合成⼀个符号,它允许宏定义从分离的⽂本⽚段创建标识符。 ## 被称 为记号粘合  

举个例子

#define GENERIC_MAX(type)

 type type##_max(type x, type y)

 return (x>y?x:y); 

这样就会避免type被认成名字的问题

 8. 命名约定

把宏名全部⼤写 函数名不要全部⼤写  

9. #undef

这条指令⽤于移除⼀个宏定义。 

如果现存的⼀个名字需要被重新定义,那么它的旧名字⾸先要被移除 

 10. 命令⾏定义

许多C的编译器提供了⼀种能⼒,允许在命令⾏中定义符号。⽤于启动编译过程。 例如:当我们根据同⼀个源⽂件要编译出⼀个程序的不同版本的时候,这个特性有点⽤处。 

 11. 条件编译

在编译⼀个程序的时候我们如果要将⼀条语句(⼀组语句)编译或者放弃是很⽅便的。因为我们有条 件编译指令。  

调试性的代码,删除可惜,保留⼜碍事,所以我们可以选择性的编译。  

#ifdef __DEBUG__

printf("%d\n", arr[i]);//为了观察数组是否赋值成功。

#endif __DEBUG__  

 

12. 头⽂件的包含

引号和<>

 13. 其他预处理指令

可以自己了解 

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

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

相关文章

DataWhale X 南瓜书学习笔记 task03笔记

对数几率回归 使用场景&#xff1a;分类任务。根据广义线性模型&#xff0c;分类任务构建模型的基本思想&#xff1a;找到一个单调可微函数将分类任务的真实标记&#xff08;值&#xff09;与线性回归模型的预测值联系起来。 对数几率回归的引入 二分类任务 输出标记&#…

从角速度向量的角度理解姿态角速度和机体角速度的转换公式

一、什么是姿态角速度 这是我从《多旋翼飞行器设计和控制》上截取的关于欧拉角的定义。无人机的姿态角速度即偏航角、俯仰角、滚转角的一次导数&#xff0c;分别是、、。 二、什么是机体角速度 这是我在网上随便找的图&#xff0c;展示了机体坐标系。这个坐标系与飞机固定连接&…

技术美术百人计划 | 《5.1.2 PBR-基于物理的相机》笔记

一、曝光三角形 1、曝光主要由三个参数控制 快门速度&#xff08;Shutter Speed&#xff09; 可以获得运动模糊&#xff08;Motion&#xff09; 光圈&#xff08;Aperture&#xff09; 可以获得景深&#xff08;Depth of Field&#xff09; 感光度&#xff08;ISO&#xff0…

vue3 通过 axios + jsonp 实现根据公网 ip, 查询天气信息

前提 安装 axios 的 jsonp 适配器。 pnpm install pingtou/axios-jsonp 简单使用说明&#xff1a;当与后端约定的请求 callback 参数名称不为为 callback 时&#xff0c;可修改。一般无需添加。 1. 获取当前电脑 ip 和城市信息 请求地址&#xff1a; https://whois.pconl…

全能的Office插件——不坑盒子 2024.0923发布,云同步配置、合并单元格复制、PPT样机展示……

昨天凌晨&#xff0c;不坑盒子上线了2024.0923版本&#xff0c;这次更新的功能比较多&#xff0c;亮点较多&#xff0c;有必要发文推荐给大家&#xff01; 向新人介绍 不坑盒子是一款全能的Office插件&#xff0c;支持微软Office和WPS Office的办公三件套&#xff08;Word、E…

构建高效企业客户管理系统:SpringBoot应用

1 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;企业客户管理系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从员工的实际需求出发&#xff0c;通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、行业类型管理、项目信息管理、…

2024 天池云原生编程挑战赛决赛名单出炉,冠军来自中山大学、昆仑数智战队

9 月 20 日&#xff0c;2024 天池云原生编程挑战赛决赛答辩完美落幕&#xff0c;12 支进入决赛的团队用精彩的答辩&#xff0c;为历时 3 个月的大赛画下了圆满的句号。其中&#xff0c;来自中山大学的陈泓仰以及来自昆仑数智的冉旭欣、沈鑫糠、武鹏鹏&#xff0c; 以出色的方案…

【运维类】信息系统运维方案(Word原件原版参考)

1 编制目的 2 系统运行维护 2.1 系统运维内容 2.2 日常运行维护方案 2.2.1 日常巡检 2.2.2 状态监控 2.2.3 系统优化 2.2.4 软件系统问题处理及升级 2.2.5 系统数据库管理维护 2.2.6 灾难恢复 2.3 应急运行维护方案 2.3.1 启动应急流程 2.3.2 成立应急小组 2.3.3 应急处理过程 …

海康HIK IN客户端使用帮助说明

HIK IN客户端是海康威视推出的一款配套公司USB相机的工具客户端。该软件不仅可以轻松的帮助用户实现画面的实时预览&#xff0c;而且支持用户USB接口连接&#xff0c;同时拥有AI参数配置等功能。 HIK IN提供了丰富的相机参数设置选项&#xff0c;能够帮助摄影师优化相机的性能&…

问请问请问2312123213123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

多快好省,高质量、低成本通过 CISSP 认证

CISSP 作为安全从业人员含金量最高的认证&#xff0c;一直以来被认为是难度较高、学习成本较大、知识点大而全的考试。这里面也有一部分因素是因为考试费用较高&#xff0c;需要 749$&#xff0c;如果不是公司能够报销通过考试以后的费用&#xff0c;我也不会贸然尝试。相比于国…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术&#xff0c;并非多大范围的网络 网关 为局域网内的用户提供了一扇门&#xff0c;通过网关可以访问到别的网络。这个门&#xff0c;就叫网关 以…

小程序面板开发教程|开发照明 Matter 面板步骤(一)

一. 前置知识 前言 出于对 Matter 标准协议及第三方设备接入的可拓展性等方面考虑&#xff0c;照明 Matter 模型面板的功能点定义会与照明的 DP 模型有所不同&#xff0c;因此本文会着重介绍照明 Matter 面板的功能点定义及与 DP 模型的区别&#xff0c;以方便面板小程序开发…

LeetCode 257. 二叉树的所有路径,dfs

LeetCode 257. 二叉树的所有路径 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 目录 LeetCode 257. 二叉树的所有路径算法选择数据结构解题步骤算法流程算法代码算法分析易错点和注意事项相似题目 算法选择 深度优…

前端——高级选择器

1.属性选择器 2.伪类选择器 - hover 鼠标悬停状态 - active 鼠标点击状态 - focus 获取焦点状态 input使用 - checked 点击勾选状态 只能单选和多选使用 示例1&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

linux网络编程7

24.9.24学习目录 一.网络通信过程&#xff08;续&#xff09;1.路由器 二.原始套接字&#xff08;SOCK_RAW&#xff09;1.创建原始套接字2.数据包解析 一.网络通信过程&#xff08;续&#xff09; 1.路由器 路由器是用于连接多个逻辑上分开的网络&#xff1b; 具有判断网络地…

Krita连接comfyui报错缺少节点如何解决

介绍一下我用的版本&#xff1a; krita5.2.3 ComfyUI-aki-v1.3 首先&#xff1a;文件夹必须严格按照ComfyUI进行命名&#xff0c;我不知道这个是不是必须得&#xff0c;但是看官方的文档以及我解决这个问题的过程时&#xff0c;是这样的。 报错信息如下图(这个报错图…

EasyCVR全方位安全守护智慧电厂:构建高效视频监控系统优势分析

随着信息技术的飞速发展和数字化时代的到来&#xff0c;电厂作为能源供应的重要枢纽&#xff0c;其安全性和管理效率成为社会各界关注的焦点。为了满足电厂对高效、智能、可靠视频监控系统的需求&#xff0c;基于EasyCVR平台建设的电厂视频监控系统应运而生。 一、系统构成 基…

110Redis 简明教程--Redis 数据类型

Redis strings 字符串是一种最基本、最常用的 Redis 值类型。 Redis 字符串是二进制安全的&#xff0c;这意味着一个 Redis 字符串能包含任意类型的数据&#xff0c;例如&#xff1a; 一张经过 base64 编码的图片或者一个序列化的 Ruby 对象。通过这样的方式&#xff0c;Redis …

MybatisPlus: Can‘t generate mapping method with primitive return type

今天启动 SpringBoot 项目时&#xff0c;报了如下错误&#xff1a;java: Cant generate mapping method with primitive return type. 这个异常是因为引入的Mapper有问题&#xff0c;解决&#xff1a; // 错误的引入 import org.mapstruct.Mapper;// 正确的引入 import org.ap…