C语言大佬的必杀技---宏的高级用法

C语言大佬的必杀技—宏的高级用法

目录:
  • 字符串化
  • 标记的拼接
  • 宏的嵌套
  • 替换多条语句
  • 防止一个文件被重复包含
  • 宏和函数的区别

可能大家在学习的时候用得比较少,但是在一些代码量比较大的时候,这样使用,可以大大的提高代码的可读性,方便我们后期维护

1、字符串化 -------( 打印变量的值和格式化字符串 ):
#define test(x,format) printf(#x "= %" #format "\n", x)

说明 :

  1. #x 在宏定义中被称为字符串化操作符,它将 x 参数转换为一个字符串,并在代码中插入。
  2. "= %" 是一个字符串,用于指定输出的格式。
  3. #format 也是字符串化操作符,将 format 参数转换为一个字符串,并在代码中插入。
  4. 整个宏的作用就是 : 可以用于打印变量的值和格式化字符串。

代码演示:

#include<stdio.h>#define test(x,format) printf(#x "= %" #format "\n", x)int main() {const char* name = "wxf";test(name,s);            //s       相当于 %sint i = 1;test(i, d);      //d   相当于%dreturn 0;
}

结果显示:
在这里插入图片描述

2. 标记的拼接---------(将宏参数进行字符串化和连接操作) :
#define test(x,format) printf(#x "= %" #format "\n", x)#define test2(i) test(age ## i,d)       //d  相当于%d   当然这里可以替换成其他的类型

说明:

在该宏的扩展部分,它将 agei 进行连接操作(使用 ## 连接运算符),形成一个新的标识符,并作为参数传递给 test 宏。

代码演示:

#include<stdio.h>#define test(x,format) printf(#x "= %" #format "\n", x)
#define test2(i) test(age ## i,d)       //d  相当于%d   当然这里可以替换成其他的类型int main() {int age1 = 21,age2=22;test2(1);test2(2);return 0;
}

结果显示:
在这里插入图片描述

3. 宏的嵌套 :

宏的嵌套是我们常用的 , 话不多说,我们直接看例子

#define F(f) f(args)
#define args a,b

说明: 第一个宏里面的f ,替换成f(args), 然后下一个宏,将args ,替换成 a, b 。两者嵌套

代码演示:

#define F(f) f(args)
#define args a,bvoid test3(int number1, int number2) {printf(" %d + %d= %d\n ", number1, number2 , number1+ number2 );
}int main() {int a = 21,b=22;F(test3);return 0;
}

结果显示:
在这里插入图片描述

4. 替换多条语句:
#define YUE_HUIU(name) do {                           \   printf("%s ,我们一起去看电影把!\n , name);       \printf("%s, 我们一起去唱歌吧!\n ", name);      \printf("%s, 我们一起回家吧!\n", name);          \
}while (0);

注意: 使用了 do...while(0) 结构来创建一个匿名的代码块,目的是为了让宏展开后能够正常使用分号进行语句结束。这种技巧可以避免在使用宏时造成错误的语法解析。

代码演示:

/*  '\' 表示续航符,表明这一行还没有结束   */#define YUE_HUIU(name) do {                           \   printf("%s ,我们一起去看电影把!\n , name);       \printf("%s, 我们一起去唱歌吧!\n ", name);      \printf("%s, 我们一起回家吧!\n", name);          \
}while (0);int main() {YUE_HUI("wxf");return 0;
}

结果显示—(宏展开后的样子):

do {printf("%s ,我们一起去看电影把!\n , "wxf");     printf("%s,我们一起去唱歌吧!\n ", "wxf");         printf("%s, 我们一起回家吧!\n", "wxf"); } while (0);
5. 防止头文件被重复包含

这个用法还是经常会用到的 ,我们经常会使用到一些自己定义的 头文件

代码演示:

#ifndef _TOOLS_H     /* tools.h   头文件的名称   */
#ifdef  _TOOLS_H//头文件内容#endif //  _TOOLS_H
6 . 宏和函数的区别
  • 函数调用时,先求出实参表达式的值,然后带入形参, 带参数的宏只是进行简单的字符替换.
  • 函数调用是在程序运行时处理,分配临时内存, 而宏展开(函函数),是在编译时进行的,展开时是不分配内存,也没有返回值,也没 有值传递.
  • 宏的参数没有类型 ,只是一个符号 ,展开时带入到指定的字符串中.
  • 使用宏的次数多时, 宏展开后源程序变长 ,函数调用不会使源程序变长.
  • 宏替换只会占用编译时间 ,不会占用运行时间,而函数调用占用的是运行时间(分配内存 ,传递参数 ,执行函数体).
    时进行的,展开时是不分配内存,也没有返回值,也没有值传递.
  • 宏的参数没有类型 ,只是一个符号 ,展开时带入到指定的字符串中.
  • 使用宏的次数多时, 宏展开后源程序变长 ,函数调用不会使源程序变长.
  • 宏替换只会占用编译时间 ,不会占用运行时间,而函数调用占用的是运行时间(分配内存 ,传递参数 ,执行函数体).

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

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

相关文章

从零开始:新手快速在国产操作系统中搭建高可用K8S(V1.28)集群落地实践

微信改版了&#xff0c;现在看到我们全凭缘分&#xff0c;为了不错过【全栈工程师修炼指南】重要内容及福利&#xff0c;大家记得按照上方步骤设置「接收文章推送」哦~ 关注【公众号】回复【学习交流群】加入【SecDevOps】学习交流群! 文章目录&#xff1a; 本文为作者原创文章…

day03_基础语法

今日内容 零、复习昨日 一、Idea安装&#xff0c;配置 二、Idea使用 三、输出语句 四、变量 五、数据类型 附录: 单词 零、 复习昨日 1 装软件(typora,思维导图) 2 gpt(学会让他帮你解决问题) 3 java发展(常识) 4 HelloWorld程序 5 编码规范 6 安装jdk,配置环境变量 电脑常识 任…

STM32-无人机-电机-定时器基础知识与PWM输出原理

电机控制基础——定时器基础知识与PWM输出原理 - 掘金单片机开发中&#xff0c;电机的控制与定时器有着密不可分的关系&#xff0c;无论是直流电机&#xff0c;步进电机还是舵机&#xff0c;都会用到定时器&#xff0c;比如最常用的有刷直流电机&#xff0c;会使用定时器产生PW…

在GIS(地理信息系统)中,常见的地理文件记录

在GIS&#xff08;地理信息系统&#xff09;中&#xff0c;常见的地理文件包括以下几种&#xff1a; .cpg&#xff08;Code Page文件&#xff09;&#xff1a;这个文件是指定地理数据文件编码的文件&#xff0c;它告诉软件如何正确地读取和解释地理数据文件中的字符编码。比如…

海外代理IP是什么?如何使用?

一、海外代理IP是什么&#xff1f; 首先&#xff0c;代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器&#xff0c;被称为“中介”&#xff0c;因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址&#xff0c;用…

Linux学习-HIS系统部署(1)

Git安装 #安装中文支持&#xff08;选做&#xff09; [rootProgramer ~]# echo $LANG #查看当前系统语言及编码 en_US.UTF-8 [rootProgramer ~]# yum -y install langpacks-zh_CN.noarch #安装中文支持 [rootProgramer ~]# vim /etc/locale.co…

差值结构的顺序偏好

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A 中有5个点&#xff0c;B中有1个点&#xff0c;且不重合&#xff0c;统计迭代次数并排序。 第一种情况 差值结构 迭代次数 L E - - 2 10491.…

python随手小练1

题目&#xff1a; 使用python做一个简单的英雄联盟商城登录界面 具体操作&#xff1a; print("英雄联盟商城登录界面") print("~ * "*15 "~") #找其规律 a "1、用户登录" b "2、新用户注册" c "3、退出系统&quo…

手动部署 OceanBase 集群

手动部署一个 OB 单副本集群&#xff0c;包括一个 OBProxy 节点 部署环境 服务器信息 IP地址 192.168.0.26 网卡名 ifcfg-enp1s0 OS Kylin Linux Advanced Server release V10 CPU 8C 内存 32G 磁盘1 本地盘 /data/1 磁盘2 本地盘 /data/log1 机器和角色划分 …

es小记(copy_to)

简单创建索引复制字段 1: 3个主分片,各自有一个副本,总分片数为 3*26; refresh_interval为刷新频率; 其他参数描述,转载自 PUT test1 { “settings”:{ “number_of_shards”: 1, “number_of_replicas”: 1, “refresh_interval”: “30s” }, “mappings”:{ “properties”…

软件工程知识总结梳理

&#x1f525;&#x1f525;宏夏Coding网站&#xff0c;致力于为编程学习者、互联网求职者提供最需要的内容&#xff01;网站内容包括求职秘籍&#xff0c;葵花宝典&#xff08;学习笔记&#xff09;&#xff0c;资源推荐等内容。在线阅读&#xff1a;https://hongxiac.com&…

ubuntu20.04 安装 pyconcorde

这个包似乎对网络环境要求挺高的&#xff0c;我们直接弄个 射线A型号 的飞机 直接使用 pip install pyconcorde 安装&#xff0c;发现在使用里面的包时会报奇怪的错误&#xff0c;于是决定寻找 github 上的 pyconcorde 源码&#xff0c;看文档进行安装 github 地址&#xff1…

计算π的近似值分数 ——python

利用格里高利公式&#xff1a; 计算 的近似值&#xff0c;直到最后一项的绝对值小于给定精度eps。 输入格式: 输入小于1且大于0的阈值。 输出格式: 输出满足阈值条件的近似圆周率&#xff0c;输出到小数点后6位。 输入样例: 在这里给出一组输入。例如&#xff1a; 0.0…

分布式锁演进-基本原理与使用

文章目录 前言一、分布式锁演进1.1 分布式锁特点1.2 阶段一1.3 阶段二1.4 阶段三1.5 阶段四 前言 在单体应用下当多线程去竞争某一共享资源时&#xff0c;我们通常会用一把锁来保证只有一个线程获取到资源。如加上 synchronize 关键字或 ReentrantLock 锁等操作。 在分布式应用…

一篇文章让你学会什么是哈希

一篇文章让你学会什么是哈希 哈希概念哈希冲突哈希函数1. 直接定址法2. 除留余数法3. 平方取中法4. 折叠法5. 随机数法6. 数学分析法 哈希冲突解决1. 闭散列1.1 线性探测1.2 二次探测 2. 开散列 开散列和闭散列对比 哈希概念 哈希在C中有广泛的应用&#xff0c;它是一种用于快…

pytest框架前后置设置,以及pytest默认规则

一、pytest框架的默认规则 1、模块名默认必须以test开头或者以test结尾 2、测试类必须以Test开头&#xff0c;并且不能有__init__方法 3、测试方法默认必须以test开头 当然以后的一些默认规则除测试类不能使用__init__方法外其余的都是可配置的&#xff0c;当然一般情况下我们…

【算法思想】排序

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

【二叉树魔法:链式结构与递归的纠缠】

本章重点 二叉树的链式存储二叉树链式结构的实现二叉树的遍历二叉树的节点个数以及高度二叉树的创建和销毁二叉树的优先遍历和广度优先遍历二叉树基础oj练习 1.二叉树的链式存储 二叉树的链式存储结构是指&#xff0c;用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑…

Redis集群架构搭建——主从、哨兵、集群

上一篇文章Ubuntu上通过源码方式安装Redis已经介绍了如何安装redis&#xff0c;在这篇文章中&#xff0c;将会教大家搭建Redis的几种高可用的架构&#xff1a;主从架构、哨兵集群、Cluster集群。 本篇文章使用的redis版本为6.2.13&#xff0c;不同版本的配置可能有略微的区别&a…

如何将内网ip映射到外网?快解析内网穿透

关于内网ip映射到外网的问题&#xff0c;就是网络地址转换&#xff0c;私网借公网。要实现这个&#xff0c;看起来说得不错&#xff0c;实际上是有前提条件的。要实现内网ip映射到外网&#xff0c;首先要有一个固定的公网IP&#xff0c;可以从运营商那里得到。当你得到公网IP后…