#define 的使用

article/2025/9/24 21:48:53

#define 多数情况下我们是用来定义宏的,但是实际上,#define 作为预处理指令,也可以用来定义标识符,类似于 typedef,但是其本质和 typedef 是不同的。


目录

一、#define 定义标识符

1、定义和使用

2、#define 定义标识符 和 typedef 定义别名的区别

二、#define 定义宏

1、无参​​​​​​​

2、有参

3、宏和函数的比较

(1) 宏的优点

(2) 宏的缺点


一、#define 定义标识符

1、定义和使用

#define 的本质是替换,将前者替换为后者,比如如果代码中使用了 reg,在预处理阶段,reg 就会被替换为register。 

#define reg register          //为 register这个关键字,创建一个简短的名字#define do_forever for(;;)     //用更形象的符号来替换一种实现#define CASE break;case        //在写case语句的时候自动把 break写上。// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \date:%s\ttime:%s\n" ,\__FILE__,__LINE__ ,       \__DATE__,__TIME__ )  

2、#define 定义标识符 和 typedef 定义别名的区别

以下面这个例子为例,p1、p2、p3、p4分别是什么类型??

#define ptr_t int*
typedef int* ptr_t2;int main() {ptr_t p1, p2;ptr_t2 p3, p4;return 0;
}

宏的本质是替换,预处理阶段会被替换成如下状态。此时 * 会优先和离自己近的变量名结合,因此p1 是 int* 型指针,而 p2 是普通的 int 型变量。

int* p1, p2;    //int *p1, p2;

但是typedef 是起一个别名,即便是换成了ptr_t2 ,ptr_t2不会替换,而是一种实打实的类型,此时p3、p4都是 int* 型,因此,p3、p4都是int* 型指针。

二、#define 定义宏

根据有无参数列表,宏的定义方式可以分为无参和有参。

1、无参

(1) 定义

无参的声明可以参考下面的例子。宏的本质是替换,所以宏是

#define reg register   // 定义标识符
#define MAX 100        // MAX 是宏的名字,100 是 MAX 对应的值

(2) 使用

#define MAX 100
int main(){int a = MAX;    // 预处理阶段,这行代码会变成 int a = 100;return 0;
}

注意 宏的本质是替换,在预处理阶段,宏的名字会被替换成对应的值,因此在声明宏的时候不能出现分号 ';',如果出现了分号就变成下面这样

2、有参

有参就涉及到参数传递了,此时需要记住:传递参数的时候,表达式不参与任何运算。宏的本质依然是替换,此时的步骤是:先传参,后替换

(1) 定义

就像函数一样,宏会接收传递给自己的参数,但是本质是不一样的

#define ADD(X,Y) X+Y            // 不推荐,这样做只是方便理解,建议带小括号
//#define ADD(X,Y) ((X) + (Y))    // 推荐

(2) 使用

#define ADD(X,Y) X+Yint main() {int a = ADD(10, 20);    // 就像调用函数一样,会进行参数传递// 但本质是替换,预处理阶段会被替换成// int a = 10 + 20;return 0;
}

注意:宏的本质是替换,即便有参数,也是先传递参数,再进行替换

(3) 宏存在参数传递时的注意事项

在定义的时候也提到了,表达式的每个变量建议加上小括号。以下面这个例子为例,本来的目的是求一个数的平方,但是实际上的结果并非如此。

#define SQUARE(X) X*X    // 求平方int main() {int a = 5;int b = SQUARE(a + 1);printf("%d\n", b);return 0;
}

 宏存在参数传递的时候表达式不会参与任何运算,所以这里是直接把 5 + 1 传递给了宏

然后是替换,此时原本的宏就会被替换为

最终得到的结果是 11,为了避免这样的情况,当宏存在表达式的计算时,表达式的每一项建立带上小括号,就像下面这样

#define SQUARE(X) ((X)*(X))    // 求平方

 

3、宏和函数的比较

宏通常被应用于执行简单的运算。函数可以参数传递,宏也可以参数传递,那么两者有什么区别呢?

(1) 宏的优点

a. 程序规模和调用速度

宏在预处理阶段就被处理了,但是函数要先经过编译、汇编等过程生成符号表才能用于后续的调用,而且函数需要有函数名、函数体。如果仅仅只是简单的功能实现,无论是调用速度还是程序规模,宏都是更胜一筹。

比如获取两个数的较大值:

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

b. 宏与类型无关

函数参数必须要声明指定类型,在没有泛型的情况下,不同类型的处理可能需要定义多个函数,但是宏与类型无关,以比较大小为例,如果只是整型家族的比较,使用宏就足矣。

(2) 宏的缺点

宏的缺点也比较直接明了:

  • 程序长度不建议太长
  • 宏无法调试
  • 由于与类型无关,使用时不够严谨
  • 存在运算符优先级问题(在介绍有参声明的时候提到了)​​​​​​​


http://chatgpt.dhexx.cn/article/hBDuSD8h.shtml

相关文章

C语言之#define用法入门详解

一、#define的基本语法 在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。 使用#define定义的常量也称为符号常量,可以提高程序的运行效率。 其常见的用法包括两种&#xff0…

python微信聊天机器人_Python搭建一个微信聊天机器人

前言 因为班群里总是挺静的,所以想着要不放个机器人试试能不能活跃活跃气氛,然后就begin网上查阅资料试着建立个机器人。 语言环境开发环境:Ubuntu16.04 编程语言:Python2.7 步骤第一步:首先安装python2.7语言 su…

Python大佬用20行代码带你打造一个微信聊天机器人(附代码)

近来,打开微信群发消息,就会秒收到一些活跃分子的回复,有的时候感觉对方回答很在理,但是有的时候发现对方的回答其实是驴唇不对马嘴,仔细深究发现,原来对方是机器人。今天,小编就带大家用20行代…

16行代码实现微信聊天机器人,自动智能回复,打团了让它来陪老婆聊天

在我们的生活和工作当中,很多时候我们并不能及时地回复消息,尤其是业务比较多的人,客户给我们发消息我们不回又不好,但又没有那么多精力时时回复,这个时候智能机器人就能帮助我们解决很多问题。 像电商类的客服,像大的QQ群/微信群管理员,以及我们打游戏的时候,挂着脚本…

利用python实现微信聊天机器人(需自己设置关键字及回复内容)

本人为python小白写此帖纪念用python写的第一个脚本 微信聊天机器人 1、通过查找截图进行鼠标点击操作 2、通过直接输入屏幕中的坐标进行鼠标点击操作(在复制他人最新信息时采用指定坐标双击) # 双击并复制信息 pyautogui.doubleClick(394,…

php个人微信聊天机器人,wxpy将个人微信号变成微信聊天机器人

一、实验环境:win10 python3 wxpy 微信版本:6.6.5 1.1、从官网下载python最新版本并进行安装。 1.2、进入python安装目录Scripts/文件夹下,使用easy_install.exe pip 命令安装pip 1.3、使用pip install wxpy 命令安装wxpy 二、源码文件demo…

一个15分钟的视频,教你用Python创建自己的微信聊天机器人文中赠送全部源代码

你好,我是程序员晚枫。 在社区交流群(👉传送门)里的朋友都知道,社区有一个智能聊天机器人: 1、24小时在线的智能客服, 2、根据大家的提问,自动回复对应的学习资料, 3、对…

微信聊天机器人

做一个微信聊天自动回复的机器人 # -*- coding: utf-8 -*- """ Created on Tue Jun 4 18:30:39 2019author: yyp """#-*- coding:utf-8 -*- import itchat import requestsdef get_response(msg):apiurl http://i.itpk.cn/api.php #//moli机器…

Python Wechaty 微信聊天机器人 padlocal协议搭建指南

python版本推荐3.9 微信机器人框架:Wechaty Python-Wechaty中文手册 开发前需要准备: Linux服务器(CentOS 8.0,Python环境,Docker)本地Python开发环境(我个人使用VSCode)申请一个…

用Python写了一个微信聊天机器人

在我们的生活和工作当中,很多时候我们并不能及时地回复消息,尤其是业务比较多的人,客户给我们发消息我们不回又不好,但又没有那么多精力时时回复,这个时候智能机器人就能帮助我们解决很多问题。 像电商类的客服&#…

Python创建微信聊天机器人

最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容。于是开始了分析思路。博主是采用了多线程群发,因为微信对频繁发…

三步轻松打造微信聊天机器人(附源码)

最近微信公众平台开发是热门,我也跟风做了一个陪聊的公众号。 其实类似的自动回话程序早就有了,比如前一阵很火的小黄鸡(还是小黄鸭来着?)。但尽管是跟风,也要体现一些不同。别人做的都是中文陪聊&#xff…

实现微信聊天机器人-中级篇

一、ChatterBot工作原理 Chatbot Engine的技术框架采用了开源项目ChatterBot (https://github.com/gunthercox/ChatterBot)。 ChatterBot是一个python库,利用它可以轻松的创建对话软件。 一个未经训练的ChatterBot实例开始不知道如何沟通,每次用户输入一个语句,ChatterBo…

微信聊天机器人,不使用iChat,可以群聊

目录 1. 微信聊天界面截图 2. 图片文字识别 3. 获取最新消息 3.1 独聊 3.2 群聊 4. 机器人聊天系统 5. 成果展示 6. 全部代码 本文参考大神【喵王叭】的文章:python实现微信、QQ聊天自动回复【纯物理】_喵王叭的博客-CSDN博客_python自动回复纯物理方式实现微…

tomcat的开发模式和生产模式

tomcat这两种模式对大家的影响主要是在jsp的开发当中。大家都知道jsp需要先编译成servlet源文件并编译为字节码,即生成.class文件才可以执行,所以在jsp文件首次运行时先要进行编译导致运行较慢,之后的访问都会直接进入执行阶段。 在开发模式下…

chrome开发模式下清除缓存问题

介绍: 在开发的时候经常会遇到这样的问题,后台js修改,前台怎么也清除不了缓存的问题,包括使用ctrlf5都没有办法处理,今天教大家一种方式,在chrome中采用开发模式下彻底清除缓存问题 一、打开chrome,随便访…

微信小程序-云开发模式pk传统开发模式【详细】

👨‍🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 小伙伴们,说起开发微…

软件开发模式之敏捷开发(scrum)

简介 这几年关于敏捷开发在互联网企业中越来越广泛被使用到,运用的比较多的当属scrum敏捷开发和xp敏捷开发,人人都在谈论敏捷开发。那什么才是敏捷开发呢? 目录 什么是敏捷开发?传统的开发模式和敏捷开发模式的对比&#xff1f…

特性分支开发模式 or 主干开发模式,团队该如何选择?

对于一个具有一定规模的开发团队而言,团队 Devops 的建设都是迈向高效开发的必经之路,即便没有达到 Devops 建设的程度,为了团队中开发之间的高效协作,基于版本管理工具来选择团队合理的代码分支开发模式都是非常重要的一环。对于…

vue项目的三种开发模式

vue项目的三种开发方式 文章目录 vue项目的三种开发方式1.原始无合作开发2.手动模块化开发3.自动模块化开发1、开发流程2、配置webpack-dev-server1.下载安装包2.配置package.json3、配置webpack.config.js4、执行程序5、调试程序 1.原始无合作开发 包含两个文件:v…