13.C基础_预处理

news2024/12/27 12:45:27

预处理语句就是以#开头的语句。这些语句类型如下:

  • #include:包含头文件
  • #define:宏定义
  • #undef:取消宏定义
  • #ifdef,#endif:成对使用,判断是否定义了某个宏

宏定义

宏定义的本质就是原样替换,写什么值就替换成什么。

形式:#define 名字 值

 1、示例使用

示例1:基本使用

#define PI 3.14
printf("%d",PI);//这实质就是执行printf("%d",3.14);将PI用3.14替换

示例2:利用宏定义中的值是其他的宏

#define a 1
#define b 2
#define c (a+b)//使用宏来充当值
printf("%d",c);//这实质就是执行printf("%d",(1+2));

示例3:宏定义实现代码开关

#define DEBUG//用作开关时,后面不跟值

#ifdef DEBUG
    printf("DEBUG");//如果宏定义了DEBUG,就执行这个语句
#endif
/* #ifdef 与 #endif 配对出现*/

示例4:改变宏定义的值

#define a 100
/* ...一些代码 */
#undef a //取消a的宏定义
#define a 200//重新定义a为200

示例5:传参数的宏

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

/* 调用 */
MAX(1,2)//即a=1,b=2,这实际就是((1)>(2)?(1):(2))

2、注意点

注意点1:当宏定义的值为表达式时,需要加括号

#define N (3+2) //这里不能写3+2,必须写(3+2)

 注意点2:宏定义的名称不能与函数名重复

注意点3:宏定义传参时,后面的值需要加括号

下列代码test2应该写为((n)*(n)) ,因为n*n也可能因为其他高优先级的情况被拆开。

3、宏定义与常量const的区别

1.1 定义不同

宏用 " #define " 声明,const 常量用 " const + 数据类型 " 声明

宏最后没用分号,const 常量声明需要用分号表示语句结束

宏不需要用等号赋值,cosnt 常量需要用等号赋值

1.2 处理阶段不同

宏定义在预处理阶段进行文本替换,const 常量在程序运行时使用。

1.3 存储方式不同

宏定义是直接替换,不会分配内存,存储于程序的代码段中。const 常量需要进行内存分配。

1.4 是否进行类型检查

宏定义是字符替换,不进行类型检查。

const 常量定义时需要声明数据类型,使用时会进行类型检测

1.5 其他

宏定义可以声明函数,也可以用undef取消宏

4、宏定义与typedef的区别

2.1 定义不同

typedef 是 C语言的关键字,用于创建类型别名,它需要使用标 识符和现有的类型进行配合

#define 是预处理指令,用于创建宏定义,它可以定义任意的标识 符和文本替换

2.2 处理阶段不同

关键字typedef在编译阶段有效,有类型检查的功能

#define则是宏定义,发生在预处理阶段,也就是编译之前, 它只进行简单而机械的文本替换,而不进行任何检查

2.3 定义变量时的含义不同

例如有以下声明:

typedef int* Pint16_t;
#define Pint16_t int*

这两种声明都是把int*用Pint16_t来替换。但定义变量时的含义不同:

/* typedef的含义 */
Pint16_t p1,p2;//这代表p1,p2都是int*类型

/* #define的含义 */
Pint16_t p1,p2;//这代表p1是int*型,p2是int型

代码验证如下: 

2.4 作用域不同

typedef 有作用域限定。如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾; 如果放在某个函数内,定义域就是从定义开始直到该函数结尾

 #define 不受作用域约束,只要是在 #define声明后的引用都是正确的,不管是在某个函数内,还是在所有函数之外,作用域都是从定义开 始直到整个文件结尾。

5、宏定义传参与函数的区别

宏在调用时的效率是比函数高很多的;

函数的参数是有类型的,也存在类型检查。但宏的参数是没有类型与类型检查的;

函数可以递归,而宏不可以递归;

函数方便调试,而宏是不方便调试的;

对于参数而言,宏的参数是直接替换的,所以会有一些参数具有副作用。而函数的参数是临时拷贝的,没有副作用的情况;

#include的<>与" "的区别

#include <xxx.h>与#include "xxx.h"的区别是搜索路径不同:

  • <>:编译器到标准库路径下寻找头文件,路径为/usr/include
  • " ":编译器先在当前文件下寻找头文件,找不到时再去标准库寻找头文件

别名typdef

1、别名基本类型

基本类型有char、int、float、double这些。

形式:typdef <类型> <别名>;

如:typdef unsigned char uint8_t,这表示uint8_t就是unsigned char

2、别名基本指针

基本指针有char*、int*、float*、double*这些

形式:typdef <指针> <别名>;

如:typdef int* PData,定义时可以用 " PData a; "来代替 " int* a; "这样使用。

别名指针后,定义指针不需要写*,类型是PData,而不是PData*

3、别名结构体

形式:

typedef struct 结构体名{
    //结构体成员
}结构体别名,*结构体指针别名;

/* 举例 */
typedef struct test{
    int a;
    int b;
}Name,*PName;

在上述举例中,是用Name作为struct test的别名,PName作为指针别名

4、别名数组指针

数组指针的定义是:<类型> (*指针名)[列大小]

别名形式就是把指针名换为别名:typedef <类型> (*别名)[列大小]

5、别名函数指针

函数指针的定义是:<返回值类型> (*指针名)(形参)

别名形式就是把指针名换为别名:typedef  <返回值类型> (*别名)(形参)

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

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

相关文章

【Material-UI】Floating Action Button (FAB) 详解:动画效果 (Animation)

文章目录 一、FAB 按钮的动画概述1. 默认动画效果2. 多屏幕横向切换时的动画 二、FAB 动画效果的实现1. 代码示例&#xff1a;跨标签页的 FAB 动画2. 代码解析3. 多个 FAB 的切换 三、动画效果的最佳实践四、总结 在现代网页设计中&#xff0c;动画不仅提升了用户界面的动态感&…

React+AntDesign做一个日历,展示节假日,节气,并且在某几个时间上添加活动备注

直接贴效果图😄 首先日历是用的AntDesign提供的Calendar组件,这个组件还是蛮强大的,可以自定义头部时间下拉;渲染每个时间段,或者重置时间段内容,玩的空间是很大的 直接贴代码,结尾最后我会将开发中遇到的问题贴出来解答一下 第一步:下载js-calendar-converter添加…

SpringBoot集成日志框架

SpringBoot集成日志框架 Java生态体系日志框架介绍 简介 在Java生态体系中&#xff0c;围绕着日志&#xff0c;有很多成熟的解决方案。关于日志输出&#xff0c;主要有两类工具。 一类是日志框架&#xff08;Log4j、Logback&#xff09;&#xff0c;主要用来进行日志的输出的…

Unity 使用 NewtonSoft Json插件报错

JsonReaderException: Unexpected character encountered while parsing value: . Path , line 0, position 0. 通过断点发现&#xff0c;头有一串ZWNBSP&#xff0c;这个是BOM格式的JSON。在文件下看不到。 解决方法&#xff1a;改编码格式&#xff0c;Remove BOM.

Linux信号的概念信号的产生

前言 我们前面已经对进程已做了介绍&#xff01;知道进程具有独立性&#xff0c;但在运行起来后可能会"放飞自我"&#xff0c;即不受控制的执行&#xff0c;这就会导致系统崩溃等问题&#xff0c;非常不利于管理。因此OS需要一种机制来协调和控制进程的运行&#xf…

【C++】拓扑排序(BFS)

目录 拓扑排序介绍 有向无环图 如何解决这类问题 课程表 算法思路 代码实现 课程表2 算法思路 代码实现 火星词典 代码实现 拓扑排序介绍 有向无环图 入度&#xff1a;指向活动节点的箭头个数&#xff1b; 出度&#xff1a;从活动节点出去指向别的节点的箭头个数。…

交互式实时距离测量-单目测距-社交距离检测

使用说明 使用鼠标点击两个目标框要删除在距离计算过程中绘制的点&#xff0c;你可以使用鼠标右键点击。这会清除所有已绘制的点 使用 Ultralytics YOLOv8 进行距离计算 距离计算是在指定空间内测量两个物体之间间隙的基本概念。在 Ultralytics YOLOv8 的情况下&#xff0c;通…

React学习-初始化react项目

目标: reactv18&#xff1a;->1.核心的22中api2路由3.数据状态管理&#xff1a;redux项目&#xff1a; 1.b端业务闭环:登录方案、权限设计、用户管理方案、业务功能、系统架构设计、路由设计流程闭环&#xff1a;开发环境、生产环境、测试环境、代码规范、分支管理规范、项…

SpringBoot整合knife4j配置使用直接拷贝即可(快速入门超详细版)

1. SpringBoor整合Knife4j添加maven 1.1 第一种maven <!--添加Knife4j依赖--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</ver…

Unity新输入系统 之 PlayerInput(真正的最后封装部分)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位和输入配置文件 Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的…

6 款最佳付费和免费 iPhone 解锁应用和软件

iPhone解锁应用程序是一种可以不受任何限制地移除 iOS 设备上不同类型锁的工具。iPhone 可能受锁屏密码、Apple ID 密码、屏幕使用时间密码、iCloud 激活锁、MDM 等保护。如果您忘记了密码&#xff0c;您将无法使用设备或无法完全访问您的 iPhone。幸运的是&#xff0c;有软件可…

跨平台控制神器Escrcpy,您的智能生活助手

Escrcpy 是一款基于 Scrcpy 开发的图形化安卓手机投屏控制软件&#xff0c;它允许用户将 Android 手机屏幕实时镜像到电脑上&#xff0c;并使用电脑的鼠标和键盘直接操作手机&#xff0c;实现了无线且高效的操控。这款软件是免费开源的&#xff0c;支持跨平台使用&#xff0c;包…

2024 年可免费下载的 6 款最佳 iOS 解锁软件

众所周知&#xff0c;如果所有者或其他人多次输入错误密码&#xff0c;iOS 会锁定并禁用 iPhone 或 iPad。Apple 推出了使用 iTunes/Finder、iCloud 或其他 iOS 设备解锁已禁用设备的方法。但是&#xff0c;每种方法都需要一些先决条件&#xff0c;例如 Apple 密码。在这种情况…

Unity使用代码生成ScriptableObject数据并赋值之后,重启数据就没有啦!

2024年8月14日早&#xff0c;因数据持续化存储&#xff0c;重启电脑后数据会丢失&#xff0c;而我找不到原因被领导质疑了&#xff0c;故写一片博客记录这个错误。 省流 使用在编辑器的play模式中为ScriptableObject赋值之后&#xff0c;需要使用 #if UNITY_EDITORUnityEdit…

GLCIC:全局和局部一致的图像补全

GLCIC&#xff1a;全局和局部一致的图像补全 前言相关介绍GLCIC 的工作原理核心思想主要组件训练目标 优点缺点总结 实验环境项目地址LinuxWindows 项目结构具体用法准备数据集进行训练进行测试 参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改…

四十一、大数据技术之Kafka3.x(4)

&#x1f33b;&#x1f33b; 目录 一、Kafka 消费者1.1 Kafka 消费方式1.2 Kafka 消费者工作流程1.2.1 消费者总体工作流程1.2.2 消费者组原理1.2.3 消费者重要参数 1.3 消费者 API1.3.1 独立消费者案例&#xff08;订阅主题&#xff09;1.3.2 独立消费者案例&#xff08;订阅分…

基于SpringBoot+Vue框架的租车管理系统

文章目录 一、项目介绍二、项目类型三、技术栈介绍1.客户端技术栈2.服务端技术栈 四、项目创新点五、项目功能介绍1.客户端功能2.服务端功能 六、项目的主要截图页面如下展示1.客户端展示2.服务端展示 七、项目源码 一、项目介绍 ​大家好&#xff0c;我是执手天涯&#xff0c;…

找出字符串中第一个匹配项的下标 | LeetCode-28 | KMP算法 | next数组 | Java详细注释

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️KMP算法练习题 LeetCode链接&#xff1a;28. 找出字符串中第一个匹配项的下标 文章目录 1.题目描述&#x1f347;2.题解&#x1f349;2.1 暴力解法&a…

【树的遍历】

题目 代码 #include<bits/stdc.h> using namespace std;const int N 40;int in[N], pos[N]; //中序、后序 int idx[N]; //中序的值->索引 unordered_map<int, int> l, r; //根节点的左、右树根节点 int n; int build(int il, int ir, int pl, int pr) {int ro…

【2】MySQL相关概念

一.数据库相关概念 二.MySQL数据库