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

news2024/10/5 22:24:11

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://www.coloradmin.cn/o/149666.html

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

相关文章

生物化学 SY002实验 最常用的酸spiric acid+阿司匹林Aspirin+从柳树皮得到水杨苷

阿司匹林已应用百年,成为医药史上三大经典药物之一。 小知识点:水杨酸的作用和阿司匹林的作用不同之处(抗凝),使用时的胃损伤等 使用历史 埃及埃伯斯纸莎草纸中关于使用白柳树叶制成的混合物治疗发炎伤口的建议。(因为柳叶和树…

软著申请你还不会?我是这样申请的

大家好,我是小悟 兄弟姐妹们,关于软著申请的话题,早前已经写过几篇文章的介绍了,包括软著的申请流程攻略和踩到被打回补正的坑,有兴趣的可以翻翻之前的文章,搜关键字【软著】就有。 私信的小伙伴来自各行…

9.Isaac教程-- Laikago 四足机器人的自主导航

Laikago 四足机器人的自主导航 开发智能机器人系统是一项多学科的工作,集成了动力学、控制、计算机视觉、人工智能等。 很难掌握所有这些领域。 即使你掌握了所有这些,也需要花费大量时间才能正确和稳健。 为了帮助机器人专家加速智能机器人的开发&…

笔试强训(12)

算法题1:计算日期到天数转换: 我们假设用例输入的是2022 1 1,那么我们对应的天数就是1天,我们就不应该在输出1月份的所有月数 public class Main {public static void main(String[] args) {Scanner scannernew Scanner(System.in);int yearscanner.next…

【uniapp小程序】上传图片

文章目录🍍前言🍋正文1、首先看官网uni.chooseImage(OBJECT) API 介绍2、案例代码演示3、效果展示🎃专栏分享:🍍前言 本篇文章我们研究一下,在移动端开发过程中经常使用到的图片上传功能。在大多数小程序或…

ArcGIS基础实验操作100例--实验68注记符号化表达

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验68 注记符号化表达 目录 一、实验背景 二、实验数据 三、实验步骤 (1&am…

C语言入门(四)——分支语句

if语句 if/else语句 布尔代数 switch语句 if语句 目前我们写的简单函数中可以有多条语句,但这些语句总是从前到后顺序执行的。除了顺序执行之 外,有时候我们需要检查一个条件,然后根据检查的结果执行不同的后续代码,在C语言中可…

ResNet精读笔记(1)

introduction部分提出了几个问题 1.构建一个好的网络 ? 把层堆起来吗 哈哈 跟堆汉堡一样 这里呢 我们都知道 当网络的层数变多之后 加深了 deep了 但是 就会带来 梯度消失或者爆炸的问题 这里 实在找不到好的图 本质上因为当层数多了之后 反向传播的计算里面是…

嵌入式:万字详解通信接口设计

文章目录UART接口UART的工作原理UART的功能和组成S3C2410A的UARTUART 操作(1)数据发送(2)数据接收(3)自动流控制(4)非自动流控制(a)接收数据操作(…

【C++】模拟实现List的正向和反向迭代器(iterator、reverse_iterator)

文章目录1、搭建List的基本框架2、List中iterator和const_iterator3、反向迭代器revser_iterator1、搭建List的基本框架 STL中List容器底层是一个双向带头循环链表。 这里简单搭建一个List,下面我们不断完善。 思路: 1、List作为一个双向带头链表&…

excel函数公式:常用高频公式应用总结 下篇

公式6:根据身份证号码计算出生日期要从身份证号码中得到出生日期,这种问题对于从事人资行政岗位的小伙伴一定不陌生,公式也比较简单:TEXT(MID(A2,7,8),"0-00-00")就能得到所需结果,如图所示:要明…

vue+xlsx实现表格的导入导出:

文章目录一、vue前端使用xlsx和 xlsx-style 导出excel,并修改样式:1、改造后效果:2、实现:3、引入库xlsx-style4、excelUtil.js文件二、前端xlsx插件怎么设置导出的excel列宽自适应?2-1、效果2-2、效果三、xlsx插件,导…

Java语法六:线程安全以及死锁

前言: 接下来我们要了解一下,线程安全的集合类有哪些?什么是死锁以及怎么避免死锁问题。 1.多线程环境使用哈希表 1.1:HashTable 只是简单的把关键方法加上synchronized关键字。 public synchronized V put(K key, V value) p…

(1分钟速览)最近邻搜索--激光SLAM常用必杀技

学习kdtree的数据结构,和二叉树的思想大体上算是比较相似的。参考博客:https://blog.csdn.net/dive_shallow/article/details/113136145建树,一个递归的操作。这里的删除操作很好理解,分左子树和右子树两种情况。如果是左子树那么…

Go语言设计与实现 -- 内存对齐机制

什么是内存对齐 为了能让CPU可以更快的存取到各个字段,Go编译器会帮你把struct结构体做数据的对齐。所谓的数据对齐,是指内存地址是所存储数据的大小(按字节为单位)的整数倍,以便CU可以一次将该数据从内存中读取出来。…

每天五分钟机器学习:推荐系统中所有用户的损失函数是什么?

本文重点 我们分析机器学习算法都是从损失函数的角度来说的,为了找到最佳的参数θ,可以最小化损失函数,那么本节课程我们将学习基于内容的推荐系统的损失函数是什么? 数据集 我们将每一个电影称为样本,每个电影有两个特征x1、x2,其中x1表示该电影为恐怖片的程度,x2表…

测试开发 | 跨平台设备管理方案 Selenium Grid

Selenium Grid 是 Selenium 的三大组件之一,它可以在多台机器上并行运行测试,集中管理不同的浏览器版本和浏览器配置。通过将客户端命令发送到远程浏览器的实例, Selenium Grid 允许在远程计算机 (虚拟或真实) 上执行 WebDriver 脚本. 它旨在提供一种在多…

SSL证书的类型

SSL证书类型分3类:DV OV EV.域名型(DV)SSL证书: 信任等级一般,只需验证网站的真实性便可颁发证书保护网站。企业型(OV)SSL证书: 信任等级强,须要验证企业的身份,审核严格&#xff0c…

VS2017基于CLR运行环境的VC++.NET界面编程(数据库为mysql)

此篇献给暨南大学珠海校区还在用VS2013编写VC++.NET界面程序的苦逼们! 文章分为四个部分: 1、运行环境的搭建 2、数据库的连接 3、控件介绍 4、程序编写示例 程序效果演示视频和程序源码及数据库文件附于文末。 一、运行环境的搭建 VS自从2013版本后淘汰VC++.NET,编写界面…

恒星物联河道流量监测站——雷达流量计

一、产品概述 河道流量监测站是一款采用一体化设计的河道流量智能监测设备,设备由河道雷达流量计、遥测终端机、太阳能供电系统组成。雷达流量计采用先进的K波段平面雷达技术,通过非接触的方式测量水体的流速和水位,根据内置的软件算法&…