当前位置: 首页 > news >正文

C语言中“#“和“##“的用法

1. 前言

# :把宏参数变为一个字符串,

##:把两个宏参数贴合在一起.

2. 一般用法

#include<stdio.h>

#define toString(str) #str //转字符串

#define conStr(a,b) (a##b)//连接

int main()

{

    printf(toString(12345)):        //输出字符串"12345

    printf("\n%d\n",conStr(1, 3));  //输出int 13

    return 0;

}

3. 注意事项

当一个宏的传入参数是另一个宏的时候,需要注意的是凡宏定义里有用#或##的地方,作为参数的那个宏是不会再展开的,即,只有当前宏生效, 参数里的宏!不!会!生!效!!!!

3.1 举例

#include<stdio.h>

#define toString(str) #str //转字符串

#define conStr(a,b) (a##b)//连接

#define AGE 18

int main(void)

{

    printf("str is:%s", toString(AGE)); //输出字符串“AGE”而不是18

    //printf("\n%s",conStr(AGE,AGE)); //语法错误 --- AGEAGE未申明的标识符

    return 0;

}

两句print会被展开为:

    printf("str is:%s", "AGE");

    printf("\n%s",AGEAGE);

分析: 
由于AGE是宏,且作为宏toString和conStr的参数,并且宏conStr和toString中均含有#或者##符号,所以AGE不能被再次展开。导致不符合预期的情况出现。

3.2 解决方案

解决这个问题的方法很简单,多加一层中间转换宏。

加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里就会先得到宏参数的值,然后再传递给后续的宏

#include<stdio.h>

#define _toString(str) #str //转字符串

#define toString(str)  _toString(str)

#define _conStr(a,b) (a##b)//连接

#define conStr(a,b) _conStr(a,b)

#define AGE 18

结果:

printf('str is:%s', toString(AGE))

//输出为: str is: 18

//toString(AGE) -> _toString(18) ->"18”

printf("n%d",conStr(AGE, AGE));

//输出为1818

//conStr(AGE,AGE) -> conStr(18,18) ->1818

相关文章:

C语言中“#“和“##“的用法

1. 前言 # &#xff1a;把宏参数变为一个字符串, ##&#xff1a;把两个宏参数贴合在一起. 2. 一般用法 #include<stdio.h> #define toString(str) #str //转字符串 #define conStr(a,b) (a##b)//连接 int main() { printf(toString(12345)): //输出字符串&q…...

Linux命令-clock命令(用于调整 RTC 时间)

说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间&#xff0c;执行这项指令可以显示现在时刻&#xff0c;调整硬件时钟的时间&#xff0c;将系统时间设成与硬件时钟之时间一致&#xff0c;或是把系统时间回存到硬件时钟。 语法 clock [--adjust][--debug][--dir…...

编程笔记 Golang基础 045 math包

编程笔记 Golang基础 045 math包 一、math包主要功能常量&#xff1a;函数&#xff1a;数值运算&#xff1a;三角函数&#xff1a;对数函数&#xff1a;随机数相关&#xff1a; 二、示例代码一三、示例代码二小结 Go 语言的标准库 math 提供了一系列基础数学函数和常量&#xf…...

[Java 探索者之路] 一个大厂都在用的分布式任务调度平台

分布式任务调度平台是一种能够在分布式计算环境中调度和管理任务的系统&#xff0c;在此环境下&#xff0c;各个任务可以在独立的节点上运行。它有助于提升资源利用率&#xff0c;增强系统扩展性以及提高系统对错误的容忍度。 文章目录 1. 分布式任务调度平台1. 基本概念1.1 任…...

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于JAVA springbootmybatis智慧生活分享平台设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末…...

详细了解C++中的namespace命名空间

键盘敲烂&#xff0c;月薪过万&#xff0c;同学们&#xff0c;加油呀&#xff01; 目录 键盘敲烂&#xff0c;月薪过万&#xff0c;同学们&#xff0c;加油呀&#xff01; 一、命名空间的理解 二、&#xff1a;&#xff1a;作用域运算符 三、命名空间&#xff08;namespace&…...

#WEB前端(HTML属性)

1.实验&#xff1a;a,img 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; a: href插入超链接 默认情况下在本窗口打开链接, target可以设置打开的窗口,parent在父窗口打开&#xff0c;blank新开串口打开,top在顶层串口打开,self为默认在本窗口打开 img: 插入图片 可以插…...

LeetCode---【和的操作】

目录 两数之和我的答案在b站up那里学到的【然后自己复写】 和为 K 的子数组在b站up那里学到的【然后自己复写】 三数之和在b站up那里学到的【然后自己复写】 两数相加【链表】我的半路答案&#xff1a;没有看到是链表在b站up那里学到的【复写失败后整理】 两数之和 我的答案 …...

Docker容器与虚拟化技术:OpenEuler 使用 docker-compose 部署 LNMP

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose 3.docker-compose 部署 LNMP 二、问题 1.ntpdate未找到命令 2.timedatectl 如何设置时区与时间同步 3.php网页显示时区不对 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注Lin…...

13-微服务初探-自研微服务框架

微服务初探 1. 架构变迁之路 1.1 单体架构 互联网早期&#xff0c;一般的网站应用流量较小&#xff0c;只需要一个应用&#xff0c;将所有的功能代码都部署在一起就可以&#xff0c;这样可以减少开发&#xff0c;部署和维护的成本。 比如说一个电商系统&#xff0c;里面包含…...

LeetCode——二叉树(Java)

二叉树 简介[简单] 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历二叉树层序遍历[中等] 102. 二叉树的层序遍历[中等] 107. 二叉树的层序遍历 II[中等] 199. 二叉树的右视图[简单] 637. 二叉树的层平均值[中等] 429. N 叉树的层序遍历[中等] 515. 在每个…...

LDR6328芯片:智能家居时代的小家电充电革新者

在当今的智能家居时代&#xff0c;小家电的供电方式正变得越来越智能化和高效化。 利用PD&#xff08;Power Delivery&#xff09;芯片进行诱骗取电&#xff0c;为后端小家电提供稳定电压的技术&#xff0c;正逐渐成为行业的新宠。在这一领域&#xff0c;LDR6328芯片以其出色的…...

用node写后端环境运行时报错Port 3000 is already in use

解决方法:关闭之前运行的3000端口,操作如下 1.WindowR输入cmd确定,打开命令面板 2.查看本机端口详情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,这里要看你自己项目中package.joson的启动命令是什…...

Git 如何上传本地的所有分支

Git 如何上传本地的所有分支 比如一个本地 git 仓库里定义了两个远程分支&#xff0c;一个名为 origin&#xff0c; 一个名为 web 现在本地有一些分支是 web 远程仓库没有的分支&#xff0c;如何将本地所有分支都推送到 web 这个远程仓库上呢 git push web --all...

【airtest】自动化入门教程(一)AirtestIDE

目录 一、下载与安装 1、下载 2、安装 3、打开软件 二、web自动化配置 1、配置chrome浏览器 2、窗口勾选selenium window 三、新建项目&#xff08;web&#xff09; 1、新建一个Airtest项目 2、初始化代码 3、打开一个网页 四、恢复默认布局 五、新建项目&#xf…...

ChatGPT支持下的PyTorch机器学习与深度学习技术应用

近年来&#xff0c;随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生&#xff0c;人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术&#xff0c;在许多行业都取得了颠覆性的成果。另外&#xff0c;近年来&#xff0c;Pytorch深度学习框架受…...

Springboot+vue的医药管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的医药管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…...

C语言:预处理

C语言&#xff1a;预处理 预定义符号#define定义常量定义宏宏与函数对比 #操作符##操作符条件编译头文件包含库文件包含本地文件包含嵌套文件包含 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //…...

计算机网络:路由协议

路由协议简介 路由协议是计算机网络中不可或缺的一部分&#xff0c;它们负责确定数据包从源地址到目的地址的最佳路径。想象一下&#xff0c;如果你是一个数据包&#xff0c;路由协议就像是地图或导航工具&#xff0c;指导你如何到达目的地。 目录 路由协议简介 工作原理简化…...

经典动态规划题目leetcode322. 零钱兑换

题目链接&#xff1a;https://leetcode.cn/problems/coin-change/description/ 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合…...

Claude Code与Kimi跨平台部署及API调优实战

1. Claude Code与Kimi跨平台部署指南 最近在折腾AI编程助手时&#xff0c;我发现Claude Code和Kimi这两个工具搭配使用效果出奇的好。作为一个经常在不同操作系统间切换的开发者&#xff0c;我花了两周时间把Windows、macOS和Linux三个平台的部署都摸了个遍&#xff0c;今天就把…...

数据结构与算法的实战场景剖析(持续更新)

1. 排序算法在数据库索引中的实战应用 数据库索引就像图书馆的目录系统&#xff0c;而排序算法就是构建这个目录的核心工具。在实际项目中&#xff0c;我们经常需要根据不同的查询需求选择合适的排序算法来构建索引。比如MySQL的InnoDB引擎就采用了B树作为索引结构&#xff0c;…...

Metasploit 框架介绍

Metasploit 是全球最流行的渗透测试框架之一&#xff0c;由 Rapid7 维护开源版本&#xff08;Metasploit Framework&#xff09;和商业版&#xff08;Metasploit Pro&#xff09;。 &#x1f4e6; 核心组件 组件 说明 msfconsole 交互式命令行界面&#xff0c;最主要的操作…...

MindSpore 环境配置完全指南侠

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知&#xff0c;本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台&#xff0c;有非常多的配置参数。详细的参数列表可以…...

实战解析:基于unidbg的APP逆向与关键算法模拟执行

1. 为什么需要unidbg进行APP逆向分析 当你尝试分析一个移动应用的核心算法时&#xff0c;最头疼的问题是什么&#xff1f;我猜90%的开发者都会说&#xff1a;无法直接运行和调试so文件中的native代码。传统的逆向方法要么需要真机环境&#xff0c;要么要处理复杂的交叉编译问题…...

ESP32以太网异步HTTPS客户端库详解

1. 项目概述AsyncHTTPSRequest_ESP32_Ethernet是一个专为 ESP32 系列微控制器&#xff08;包括 ESP32、ESP32-S2、ESP32-S3、ESP32-C3&#xff09;及 WT32_ETH01 以太网开发板设计的异步 HTTPS 客户端库。其核心目标是为资源受限的嵌入式设备提供一种高效、可靠且内存友好的方式…...

Jetson设备开机到登录界面一站式美化:从CBoot Logo、GDM3锁屏到桌面背景的完整配置流程

Jetson设备从开机到桌面的视觉美化全流程指南 当你拿起一台Jetson设备准备演示产品原型时&#xff0c;第一印象往往从开机画面就开始了。作为开发者&#xff0c;我们常常花费大量时间优化核心功能&#xff0c;却忽略了用户体验链条中最直观的视觉环节。本文将带你完成从冷启动到…...

InnoDB存储结构全解析:行页区段与单表W行的关系既

一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作&#xff0c;需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释&#xff08;因业务实际需要存储大数值关联字段&#xff09;。 表的核心特性为Java 多线程密集读写&#xff0c;业务请求持续高…...

构建真正AI-ready的可观测体系(不是简单加个Prometheus):LLM服务、向量DB、微批Pipeline全链路告警设计实战

第一章&#xff1a;AI原生软件研发监控告警体系搭建 2026奇点智能技术大会(https://ml-summit.org) AI原生软件具备动态推理路径、模型权重漂移、Prompt变异响应、多模态输入不确定性等独特可观测性挑战&#xff0c;传统基于微服务的监控范式难以覆盖其全生命周期异常。构建面…...

基于STM32LXXX的数字电位器(TPL1401DSGR)驱动应用程序设计

一、简介: TPL1401DSGR 是 TI 带输出缓冲器的数字电位器,相比普通数字电位器,其缓冲输出能保证负载改变时电压不跌落,非常适合作为可编程电压源使用。 二、主要技术特性: 抽头数:256(8bit 分辨率) 接口:I2C(支持 1MHz Fast+ 模式) 工作电压:1.8V ~ 5.5V(与 STM…...