C语言中宏定义中#和##使用详解

目录)

    • 一、简介
    • 二、使用详解
      • 2.1 # 是将后面的字符串加“”变成编译器眼中的字符串
      • 2.2 ## 是将两串字符联接成一串
    • 三、其他相关链接
      • 1、C语言常用函数详细总结
      • 2、C语言中指针、数组作为作为函数参数使用总结
      • 3、C语言常见数据类型字节数和打印格式总结
      • 4、C语言、Makefile和shell中添加打印调试信息总结
      • 5、c语言volatile关键字总结
      • 6、c语言attribute关键字参数总结

一、简介

本文主要讲解C语言中宏定义使用#和##的场景,通过实例方便大家快速掌握。

二、使用详解

2.1 # 是将后面的字符串加“”变成编译器眼中的字符串

如果#后面跟着宏名,那么还没得及展开宏,就变成字符串了,最后生成的字符串就变成”宏名“,如果想生成”宏展开“,那么就不让要编译器解析的时候,一解析就看到#,一般可以放进下一层,这样展开看到#的时候,#后面跟着的宏名也会被展开,从而就变成我们想要的"宏展开",比如:

#define TO_STR_(str)    #str
#define TO_STR(str)    TO_STR_(str)  #define  mystr        hello
printf(TO_STR(mystr))     //对应printf("hello")
printf(TO_STR_(mystr))     //对应printf("mystr")

2.2 ## 是将两串字符联接成一串

1)一般可用于变量定义的时候的,用于添加前缀和后缀,因为宏的展开是预处理阶段,所以会在编译的时候就会生成最终的变量名称。比如定义一个变量为"模块名称_变量名称“,这两个人名称可以在不同的地方定义,公共代码中定义变量名称,引用处调定模块名称,这样每个引用的模块都可以生成一个不一样的的变量名称。

2)同样,如果前缀后缀是宏的话,也需要再添加一级,避免把宏名联接进来,下面示例说明
示例1:

#define STR_CAT_(a,b)    a##b#define STR_CAT(a,b)    STR_CAT_(a,b)#define x   module#define y   nameint STR_CAT_(x,y)        //int xyint STR_CAT(x,y)        //int modulename

示例2:

#define LOG(loglevel,...)  if(loglevel > 0)printf(fmt" line:%d - %s/%s   \n",##__VA_ARGS__,__LINE__,__TIME__,__DATE__)

示例3:

#define UNUSED(x, ...)              (void) ((void) (x), ##__VA_ARGS__)

三、其他相关链接

1、C语言常用函数详细总结

2、C语言中指针、数组作为作为函数参数使用总结

3、C语言常见数据类型字节数和打印格式总结

4、C语言、Makefile和shell中添加打印调试信息总结

5、c语言volatile关键字总结

6、c语言attribute关键字参数总结

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

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

相关文章

【办公自动化】python实现图片上传到阿里云OSS

阿里云OSS简介 阿里云对象存储服务(Object Storage Service,简称OSS)是一种高可靠、高可用、安全稳定的云存储服务。它提供了海量、安全、低成本、高可靠的存储服务,适用于各种类型的文件存储需求。 阿里云OSS使用方法 注册阿里云账号并登录; 创建OSS…

【办公类-21-01】20240117育婴员操作题word合并1.0

背景需求: 最近学校组织老师们学习“育婴员”高级,每周学习2题操作,所以我是把每个学习内容单独做在一个word文件里 上周8套保健操作学完了,需要整理,并将8份Word文件合并 第一步:doc装docx 合并时程序报…

leedcode刷题day2

题目: 根据这道题我的思路是用python首先将第一个值赋给a,然后将下一个值赋值给b在这里写一个循环计算下一个值是否等于a,不等于就进入数组当等于a的时候输出数组长度,然后比较数组长度输出最长长度对应的元素不过显然这很慢。 然…

在Linux中安装和配置Node.js与Express.js创建HTTP服务器

在Linux环境中,安装和配置Node.js与Express.js来创建一个HTTP服务器需要一系列的步骤。下面是一个详细的指南,帮助你在Linux上设置这个环境。 步骤1:安装Node.js 首先,你需要确保你的Linux系统已经安装了Node.js。你可以通过以下…

探索设计模式的魅力:“感受单例模式的力量与神秘” - 掌握编程的王牌技巧

在软件开发的赛场上,单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员,它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱,从历史渊源到现代应用,从基础实现到高级技巧&#xf…

【笔记】关于期刊

什么是统计源期刊 统计源期刊,全称为“中国科技论文统计源期刊”,也称作中国科技核心期刊,是由中国科技信息研究所(ISTIC)受国家科技部委托,选定的一系列在中国出版的高质量自然科学类学术期刊。这些期刊是…

怎么做好小红书投放复盘,品牌运营总结

小红书作为主流的传播平台,聚焦了众多品牌的关注。但是对于小红书达人投放而言,是否完成投放就意味着任务结束了呢?其实并非如此,达人投放复盘也非常重要。今天我们就带大家了解一下怎么做好小红书投放复盘,品牌运营总结&#xf…

element中Table表格控件单选、多选功能进一步优化

目录 一、代码实现1、 父组件2、子组件&#xff08;弹框&#xff09; 二、效果图 一、代码实现 1、 父组件 <template><div><!-- 用户选择嵌套弹框 --><el-dialog :close-on-click-modal"false" :close-on-press-escape"false" tit…

零基础学Python(1)— 一文带你了解什么是Python(包括Python解释器安装步骤等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。从今天开始&#xff0c;我们就一起进入Python的世界&#xff01;&#x1f389;为了让大家能够牢固地掌握Python语言&#xff0c;本系列文章就循序渐进&#xff0c;从最基础的知识开始讲起&#xff0c;教大家如何去使用Pyth…

Spring-BeanPostProcessor PostConstruct init InitializingBean 执行顺序

执行顺序探究 新建一个对象用于测试 Component public class Student implements InitializingBean {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}pu…

代码之外:工程师的成长进阶秘籍

程序员只懂技术能行吗&#xff1f; 为什么说技术人员“说”和“写”总得擅长一个&#xff1f; 你以为的“关注结果”是真的结果吗&#xff1f; 从一线工程师跃升团队管理者一共分几步&#xff1f; 在不断变化的职场…

Linux粘滞位的理解,什么是粘滞位?

文章目录 前言如何理解&#xff1f;粘滞位的操作最后总结一下 前言 粘滞位&#xff08;Stickybit&#xff09;&#xff0c;或粘着位&#xff0c;是Unix文件系统权限的一个旗标。最常见的用法在目录上设置粘滞位&#xff0c;如此以来&#xff0c;只有目录内文件的所有者或者root…

zabbix其他配置

自动发现 zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大。 systemctl disable --now firewalld setenforce 0 hostnamectl se…

docker 部署 springboot 2.6.13 jar包流程笔记

1 . 将dockerfile复制到与jar包同一目录 Dockerfile # 基础镜像 FROM openjdk:8 # 环境变量 ENV APP_HOME/apps # 创建容器默认进入的目录 WORKDIR $APP_HOME # 复制jar包到容器中 COPY ./elastic-log-service.jar ./elastic-log-service.jar # 暴露端口 EXPOSE 8003 # 启动命…

[Docker] 镜像讲解

Docker镜像讲解 镜像是什么 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;他包含运行某个软件所需的所有内容&#xff0c;包括代码、运行时库、环境变量和配置文件。 所有的应用&#xff0c;直接打包docker镜…

还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

本文会给大家介绍如何在WordPress上安装一个插件&#xff0c;实现将notion上写的文章自动同步到WordPress上&#xff0c;从而提高写作效率&#xff0c;接下来请跟随我的脚步一起来操作吧&#xff01; 一、插件安装 在WordPress后台添加新插件页面中搜索“notion”&#xff0c;…

ip2domain - 批量查询ip对应域名、备案信息、百度权重

免责声明 由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章及作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&#xff01;如有侵权烦请告知&#xff0c;我们会立即删除并致歉。谢谢&#xf…

在Flutter中使用Install_Plugin安装APK

目录 前言添加依赖添加权限下载APK安装APK 前言 在开发Flutter应用时&#xff0c;有时候我们需要实现在应用内部安装APK的功能。众所周知&#xff0c;Android 7.0以后由于改变了文件URI的访问方式&#xff0c;我们需要使用FileProvider来创建一个content://URI来授予临时访问权…

应该怎样保存用户密码

应该怎样保存用户密码&#xff1f; 首先&#xff0c;MD5 其实不是真正的加密算法。所谓加密算法&#xff0c;是可以使用密钥把明文加密为密文&#xff0c;随后还可以使用密钥解密出明文&#xff0c;是双向的。 使用 MD5 运算后得到的都是固定长度的摘要信息或指纹信息&#x…

C#:接口中如何将某个值类型的字段传null?

在实际对接第三方接口时&#xff0c;偶尔会有一些字段在某些情况下是不需要传值的。那如何处理呢&#xff1f; 有两种方法&#xff1a; 1、将值类型改为可空类型&#xff1b; 2、定义基类&#xff0c;基类包含所有必须要传的字段&#xff0c;子类则加入偶尔需要传的字段。 下…