【C语言】详解#define,#ifdef,#ifndef,#elif,#undef,以及相关运算符

article/2025/8/30 6:42:16

1.明示常量 #define

预处理指令结尾不带;(分号),在预编译的过程中使用宏的地方会进行展开,是用多少次就展开多少次,但是只替换 不计算,预处理器在发现程序中的宏后,会用宏等价的替换体进行替换,如在上图中,M 将被替换为100

但是双引号中的宏不会被替换

 

其实很好理解,如果宏和你所使用的字符串重名,那么双引号的字符串当然不会被理解成宏


2.在#define中使用参数 

很明显看到后两个和预期不符,此处验证了宏参只替换不运算的性质

倒数第二个表达式 x+1*x+1=5+1*5+1=11

最后一个  100/x*x=100/5*5=100

所以你想让任何地方的Square都不出错最好的办法就是不要吝啬括号的使用

 

即使这样也无法解决前置++的问题 

 由于第一个表达式前置++,所以两个++x都应该先++再使用,++两次之后x变成7 

最后一个后置++是使用x的值计算,最后再把x++

 可以很好看到前置后置的区别,如果对这块还不是很清楚,可以去看 前置 后置辨析


 3.用宏参数创建字符串

前面说到过,双引号中的宏并不会被替换,但是想在双引号里面包含宏怎么办呢?

 

 “#x” 就会把双引号里面的字符宏变成真正的宏


4.预处理器粘合剂:##运算符

##可以把两个字符串粘结在一起

 x和1粘合在一起就是x1


5.变参宏:...和__VA_ARGS__

__VA_ARGS__是C99中新增的

 ...表示宏参中可以变化的部分,而__VA_ARGS__则出现在替换部分中,表明省略号代表什么

值得注意的是,省略号只能代替最后的宏参数


 6. #undef

#undef表示取消定义

前面无论是否写过 #define M 100这样的宏M

使用#undef M之后就会把在之前的都清除

但是千万注意,宏的作用域是全局

 这题最后的答案是A,因为define在预处理阶段就把main中的a全部替换为10了。另外,不管是在某个函数内,还是在函数外,define都是从定义开始直到文件结尾,所以如果把foo函数的定义放到main上面的话,则结果会是50..50


7.条件编译

#ifdef 后面加宏,表示如果定义过这个宏,就执行后面紧跟的语句

由于我们没有定义过M,所以输出No

#ifdef和#endif一定要一起使用,即使没有#else

 具体的使用规则和if  else相似


8.#ifndef

和上面#ifdef的用法完全一样,但是逻辑相反,#ifndef M表示如果没有定义M的话就执行后面紧跟的语句

 


 

9.#if 和 #elif后面加常量表达式 

 

 同样后面吧必须加上#endif


如果对你有帮助的话,留一个免费的

 


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

相关文章

Vue 项目报错:‘$‘ is not defined ( no-undef )

错误描述 报错如上图所示,错误原因是不认识 $ 符,他是 JQuery 中得符号,我也确实引入了 JQuery: 解决办法 在 vue 项目的根目录下创建一个 .eslinttrc.js 文件,文件内容如下: module.exports {root: true…

undefined和is not defined区别

undefined定义: undefined是javascript的一种基本数据类型,变量未赋值或者函数没有返回值时返回。 xxx is not defined是一种错误类型,其完整形式是:Uncaught ReferenceError: xxx is not defined(未捕获的引用错误&a…

#define #undef等基本知识

1、预处理符号 例子&#xff1a; #include <stdio.h> #define DEBUG_PRINT printf("FILE %s line %d:" \"x%d, y%d, z%d," \__FILE__,__LINE__,x,y,z) //或者如下: //#define DEBUG_PRINT printf( "File %s line %d:…

undefined和is not defined一样吗?

https://blog.csdn.net/sheldon178/article/details/48298151/ undefined和is not defined&#xff0c;字面意思看来没什么两样&#xff0c;不都是未定义吗&#xff1f; 在JavaScript中&#xff0c;可并非如此。 undefined定义如下&#xff1a; undefined是javascript的一种…

C++中 #define 与 #undef

define 宏指令 #define 与 # include类似,它的好处呢就是速度快,使用define定义函数可以减少函数调用的额外开销 define 主要体现在2个地方 1 定义一个值 2 定义一个函数或者说功能 #include <iostream> using namespace std; // 定义一个值 #define HELLO_WORLD "…

#define #undef 使用

#define 是宏定义 #define 的用法是非常多功能的&#xff0c;它不止能实现常量宏定义&#xff0c;开关&#xff0c;还能实现函数 #undef 是取消宏定义 在undef后面要加上你要取消的宏定义 不想取消在后面可以瞎写但是不能为空 例子 #include "stdio.h"int main(…

C语言 #undef的用法

C语言中#undef的语法定义是&#xff1a;#undef 标识符&#xff0c;用来将前面定义的宏标识符取消定义。 然而&#xff0c;在实际应用中&#xff0c;#undef到底可以用来做什么&#xff1f; 整理了如下几种#undef的常见用法。 1. 防止宏定义冲突 在一个程序块中用完宏定义后&…

Perl学习-undef值和defined函数

undef值 undef是未定义的意思&#xff0c;在Perl中&#xff0c;会假设undef的变量时0或者空字符串 如果当成数字&#xff0c;就是0如果当成字符串&#xff0c;就是空字符串 当成数字 1 $n 1;2 3 while($n < 10){4 $sum $n;5 $n 2;6 }7 8 print "The tota…

吊打迅雷,最好用的BT种子下载器,下载不限速

今天小七要给大家带来的是一款安卓端BT下载器&#xff0c;用它来找片&#xff0c;下片&#xff0c;简直爽到极点&#xff0c;目前完全免费&#xff0c;无广告、无会员限制、极速下载、运行稳定支持多种格子解析、支持边下边播等等&#xff0c;拥有迅雷的所有功能&#xff0c;同…

比迅雷好用,下载速度快5倍的下载软件IDM(Internet Download Manager)

家好&#xff0c;很高兴大家阅读本文章&#xff0c;我一直在做自媒体&#xff0c;而且自媒体现在也当自己的一份工作来做了&#xff0c;那么在做自媒体的过程&#xff0c;肯定也会需要找素材&#xff0c;而在找素材的过程中需要用到下载工具&#xff0c;大家说说看现在国内&…

视频下载神器,支持 80+ 网站,比迅雷还快!

点击上方“逆锋起笔”&#xff0c;公众号回复 编程资源 领取大佬们推荐的学习资料开源最前线(ID:OpenSourceTop)编译 项目地址&#xff1a;https://github.com/soimort/you-get 今天&#xff0c;推荐一款下载神器&#xff0c;秒杀市面上你知道的所有下载工具&#xff0c;它就是…

迅雷自带的影音如何删除

1、首先下载迅雷影音&#xff1a; 2、下载之后&#xff0c;找到安装包&#xff0c;右键以压缩工具打开&#xff1a;并找到里面的XmpUninstall.exe文件---复制。 3、 复制到迅雷的安装路径下的这个路径&#xff1a;D:\Thunder Network\Thunder\Program\XMP\Program\XLGame&#…

群晖 NAS DSM 系统,只要三步使用 Docker 安装迅雷远程下载

前段时间群晖和迅雷的合作宣告终止&#xff0c;套件中移除了迅雷&#xff0c;但是说实话 DSM 自带的Download Station 实在是太慢了&#xff0c; 但是只要是 NAS是64位的处理器都可以使用 docker 套件&#xff08;好奇的同学可以了解一下 docker 的强大&#xff09;。 所以…

提高你的迅雷速度,绝对值得一看

QUOTE: 很多朋友都喜欢看电影,玩游戏.有个好的下载工具是必要的..迅雷 ,网快,bT,影音传送带 相信大家大多都使用,这四种.而相信大多数人都会使用迅雷,那是因为迅雷的速度比其它软件快的最主要的原因&#xff0c;是因为它可以通过查询候选资源来实现从多个服务器同时下载。而且…

两款清爽全能的下载神器,还不跟迅雷说拜拜?

前言 下载工具一直以来都是刚需&#xff0c;无奈近些年迅雷变得不好用后&#xff0c;广告、限速、限资源等等&#xff0c;能完美替代迅雷的免费给力的下载工具确实不好找。HTTP 类型的链接还好说&#xff0c;而种子和磁力链接这些依赖于大家做种分享的资源&#xff0c;没有迅雷…

迅雷想翻身,但区块链是好选择吗?

沉寂已久的迅雷&#xff0c;如今又有了新动作。 2月16日&#xff0c;迅雷集团旗下迅雷链推出的企业数字藏品服务平台正式上线。据悉&#xff0c;迅雷链企业数字藏品服务平台是基于迅雷链底层技术打造的&#xff0c;为企业和机构提供可信存证技术和数字藏品凭证的区块链云服务平…

linux下迅雷的替代

想用迅雷下载电影资源 经历了前几次调教之后&#xff0c;老糖的小笔电越来越好用&#xff0c;不过人的欲望始终是没有穷尽的。本来一开始直说把这个装了linux的老爷机用来看看在线视频&#xff0c;更更文就可以了&#xff0c;结果用着用着问题就又来了&#xff1a;好多老电影已…

迅雷和BT有什么区别?迅雷是不是不毁硬盘?速度快吗?

2007-10-10 14:00:16 迅雷是基于P2SP技术的下载软件&#xff0c;bt使用的是P2P技术&#xff0c;相信您应该有所了解。然而P2SP技术和P2P技术还是有差别的。 什么是P2SP技术&#xff1f; ------------------------------------------------- P2SP出现使用户有了更好的选择&…

封杀迅雷办法

带宽以及网络速度是最让企业网络管理员头疼的问题了&#xff0c;就目前中小企业来说P2P类软件是带宽的杀手&#xff0c;相比各位企业网络管理员都或多或少领教过BT或电驴等P2P软件对于网络带宽的“霸占”&#xff0c;当然除了这些传统下载工具外迅雷可以说是集众多P2P软件的“大…

推荐两款ios端磁力下载工具

说到磁力下载工具&#xff0c;大家第一个想到的就是迅雷对不对&#xff0c;然后又会想到一些莫名的画面&#xff0c;那除了迅雷&#xff0c;还有哪些磁力下载工具支持ios呢&#xff1f;今天我介绍两款款磁力下载工具给大家。 首先&#xff0c;对于安卓用户&#xff0c;大家可以…