C++中连接符#/##的作用

C/C++学习日记:C语言宏定义##连接符和#符的使用 前言:C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。 关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #... 阅读详情


http://feihe027.blog.163.com/blog/static/593258332010329104333781/

宏定义中的井号

1)# 只在有参数的定义时用到,为把参数产开并转化成字符串即用""引起来。里面的空格分割全部改为一个,并且会自动添加转义字符'\'

2)##可以用于有无参数都行。它作用就是把##前后连个东西连起来形成新的标示符。

3)#@和#类似,只不过是用''引起来。

考虑下面的宏

#define stringer( x ) printf( #x "\n" )

stringer( In quotes in the printf function call );

stringer( "In quotes when printed to the screen" );  

stringer( "This: \" prints an escaped double quote" );

#define F abc

#define B def

#define FB(arg) #arg

#define FB1(arg) FB(arg)

FB(F B)

FB1(F B)

#define paster( n ) printf_s( "token" #n " = %d", token##n )

paster( 9 );

#define makechar(x) #@x

a = makechar(b);

 

 

 

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释

#符是把传递过来的参数当成字符串进行替代。

假设程序中已经定义了这样一个带参数的宏:

#define PRINT( n ) printf( "token" #n " = %d", token##n )

同时又定义了二个整形变量:

int token9 = 9;

现在在主程序中以下面的方式调用这个宏:

PRINT( 9 );

那么在编译时,上面的这句话被扩展为:

printf( "token" "9" " = %d", token9 );

注意到在这个例子中,PRINT(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。

可想而知,上面程序运行的结果就是在屏幕上打印出token9=9

还有点不明白?!

再来一个例子:

#define PRINT( n ) printf( "token" #n " = %d", game##n )

int token9 = 9;

int game9 = 99;

调用:

PRINT(9);

屏幕上打印出:

token9 = 99; :)~

5-DOF机械臂课程设计(一)之正逆运动学 文章目录基本要求基本概念关节坐标系的建立正运动学求解DH参数表的建立逆运动学求解多解下解的选取源码下载后续 基本要求 ​ 开发上位机程序,要求有良好的界面,能提供关节空间下和笛卡尔坐 标下表示的目标位姿点和中间若干经过点的输入功能,进行轨迹规划, 并控制机械臂沿轨迹运动,最终完成目标抓取的任务。 基本概念 连杆长度 :2个相邻关节轴线之间的距离 连杆扭角 :2个相邻关节轴线之间的角度 连杆偏距 :2个关节坐标系的X轴之间的距离 关节角度 :关节变量 计算时需要加初始角度偏移 关节坐标系的建立 ​ 根据《机 阅读详情

相关推荐

全自动数据分析 - Claude Code Sub-Agents:自动化数据分析工厂

别忘了!claude code也是agent框架,类似langgraph,crewAI,autogen等等agent框架。我改造claude code搞一个数据分析智能体AI。试试看行不行!:让数据分析变得像聊天一样简单!

liangdabiao的博客 1072

C/C++预处理指令#define 之##连接符的用法

本文结合项目实例进行了##连接符用法剖析。 关于C风格的预处理符号定义#define 的用法,很多人已经非常熟悉,我也很乐于使用一个容易记忆的宏定义,代替记忆一串数字。 #define PIE (3.14159265358979323846264338327950288419716939937510582097494459230781640628620899) 在定义这一宏后,程

zvvzxzko2006的专栏 2530

嵌入式Linux网络调试踩坑记:YT8531/YT8521 PHY驱动移植与设备树配置实战

本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的实战经验。从网络不通的常见现象入手,详细介绍了驱动移植关键点、设备树配置详解及常见问题排查技巧,帮助开发者快速解决RGMII接口调试难题,提升嵌入式网络开发效率。

weixin_42525328的博客 446

python使用mysql数据库

  Python使用MySQL数据库(新)   一,安装mysql   如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可。 Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的linux 仓库中都会有mysql ,我们只需要通过一个命令就可以下载安装: Ubuntu\deepin >>sudo a...

weixin_33851177的博客 594

ALTERA MAX10 FPGA 串口远程升级实战:从原理到烧录的避坑指南

本文详细解析了ALTERA MAX10 FPGA如何通过串口实现远程升级。文章从工程师实战经验出发,深入剖析了MAX10片内Flash的双镜像备份原理、CONFIG_SEL引脚启动机制,并重点介绍了使用On-Chip Flash IP核进行擦写操作的核心流程。同时,提供了从Quartus工程配置、RPD文件生成、串口协议设计到驱动代码编写的完整避坑指南,旨在帮助开发者稳定、高效地完成远程升级功能部署。

weixin_29197699的博客 274

AI 模型训练核心方法论:零基础也能落地的 8 个关键阶段

本文是为 AI 零基础学习者打造的模型训练入门指南,以生活化语言拆解核心概念,规避专业术语壁垒。内容先通俗阐释模型训练、监督学习、数据集划分等基础概念,再按问题定义、数据准备、模型选择、环境搭建、训练、评估、调参、部署 8 个阶段,拆解完整训练流程,搭配 PyTorch 代码示例与实战案例,同时提供资源预算、常见问题解决方案及学习路径。指南强调数据的核心重要性,推荐新手优先使用迁移学习和免费 GPU 资源,兼顾理论与实操,帮助学习者快速上手,避开训练误区,独立完成从模型搭建到部署的全流程。

weixin_52741870的博客 469

C++/C宏定义中## 连接符与# 符的含义

C++/C宏定义中## 连接符与# 符的含义

danshiming的博客 1151

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

里面包含了支持者的名字,职业和雇主,地址,赞助金额。我们可以已经能想到如何切割、整理数据,来提取赞助者的统计数据,或提取宣传活动的模式,这里我们展示一些不同的分析方法。可以看到有些职业是同一种工作类型,指代的是同一个东西。这两个连续操作是分别独立执行的,一个结束后,另一个才开始。上,这里我是把数据集压缩成了ZIP格式,解压后能正常导入)。我觉得也有必要好好了解一下,这个网站做了很好的讲解,),所以我们最好添加这样的信息。这样的情况,即把两个索引操作连在一起。,发现映射关系被正常执行了,所以这里的。

Cachel Wood的博客 350

c++/c中的##连接符的使用

在c/c++语言中,我们可以使用##来对一些字符进行连接,方便使用,尤其是在宏定义中使用该符号,可以省下很多工夫,详细的例子如下所示: #define GetSVN_Version(Type) GetSVN##Type##Version void GetSVNClientVersion(int iValue) void GetSVNPoolVersion(int iValue) ...

songlipeng的专栏 3620

【异常】安装hermes-agent提示Git克隆仓库网络中断 fetch-pack: unexpected disconnect while reading sideband packet

本文分析了Git克隆仓库时出现网络中断错误的常见原因及解决方案。报错表现为连接被远程主机关闭、管道破裂或数据包意外终止,通常由网络不稳定、仓库过大或配置不当引起。提供了5种优先级排序的解决方法:1)使用浅克隆减少数据量;2)优化Git配置参数;3)切换网络或配置代理;4)检查SSH密钥设置;5)改用HTTPS方式克隆。特别推荐先尝试「浅克隆+HTTPS」组合方案快速验证,若问题持续再根据具体报错深入排查。文中包含详细的命令示例和配置说明,适合不同网络环境下的Git用户参考。

奶爸的编程之路,也就一周冷个三天 1419

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8314

C/C++宏定义连接符“\”

        在C/C++宏定义中规定,宏定义只允许写在同一行,下一行就不属于这个宏定义了,而实际定义宏过程中,经常会出现较复杂的宏定义,较长,写在一行不易于读懂,需按逻辑关系断行编写,此时需要在行的末尾用连接符“\”进行连接,表示上下行属于同一行,即同属于这个宏定义。// Connector.cpp : Defines the entry point for the console appli...

Gordennizaicunzai的博客 2455

FX5U PLC运动控制库安装(PLCopen Motion Control FB参考)

下面我们介绍三菱FX5U PLC的运动控制库PLCopen Motion Control FB的安装。

RXXW_Dor的博客 1527

宏定义中#与##的运用

#与##在宏中的运用

huichaochao的博客 2217

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

c 宏 中 # ## @ 分别表示什么意思

c 宏 中 # ## @ 分别表示什么意思

xie__jin__cheng的博客 1257

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C/C++笔记之宏定义的#和##区别

C++笔记之宏定义的#和##区别 #:是一个指示符,指示其后面的变量名替换变成一个字符串。 eg: int zero; //定义zero变量 #zero;//zero从变量变成了字符串‘zero’ ##:是一个连接符,表示它和它后面的变量名合并在一起。 eg: int i,a,ia;//定义变量 i##a = ia;//变量i与变量a的变量名结合在一起,等同于变量ia ...

qq_36836950的博客 207

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

单井号(#)和双井号(##)

在宏定义中经常会用到#和## 单井号(#) 把传递过来的参数当成字符串进行替代 如下示例: 程序代码 #define display(name) printf(""#name"") int main() {   display(name); } 输出: name 双井号(##) 称为连接符 在带参数的宏定义中将两个子串(token)联接起来,从而形成一

tiger9991的专栏 6052

C/C++中单井号与双井号的使用

在宏定义中经常会用到#和## 单井号(#) 把传递过来的参数当成字符串进行替代 如下示例: 程序代码 #define display(name) printf(""#name"") int main() {   display(name); } 输出: name 双井号(##) 称为连接符 在带参数的宏定义中将两个子串(token)联接起来,从而形成一个

davil_dev的专栏 3264

C语言中的## 与 #

宏定义中的## 连接符与# 符## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例...

weixin_30726161的博客 82

C++中#(一个#号)和##(两个#号)的用法和作用

1 C++中#(一个#号)和##(两个#号)的用法和作用 1 关于一个#号: 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作, 简单说就是对他所引用的宏变量通过替换后再其左右各加上一个双引用。 例子: # define WARNIF(EXP) \ do{ \ if (EXP) \ { \ fprintf(stderr, "warning:" #EXP "\n"); \ } \ }while(0) 在实际使用中会出现下...

奋斗Andy的博客 1万+

C++宏定义中#和##的用法

介绍C++的宏中#和##的用法。前者为将输入转换为字符串,后者作用是将前后两部分进行拼接。

凡辰道 6603

C++ #号、##号

“有人认为爱是性,是婚姻,是清晨六点的吻,是一堆孩子,也许真是这样的,莱斯特小姐。但你知道我怎么想吗,我觉得爱是想触碰又收回手。” ——塞林格 《破碎故事之心》 前两天看业务代码的时候看到了#号,因为自己从Python转过来,因此总觉得像在看注释。拖了几天,今天就来整理一下C/C++中的 # 与 ##。 下面内容整理自以下博客: C语言宏与单井号(#)和双井号(##) C/C++ 中##(两个井号)和#(一个井号)的意思 在C语言的宏中,# 的功能是将其.

Tao_758的博客 2098

#define中##连接符、#符以及#@符的使用

      在C或者C++中define宏使用得很多,它的基本用法书上以及网上介绍的文章很多,这里我就介绍一下define宏中的几个常用符号的用法,##连接符、#符以及#@符。      我们定义:     #define A(x) T_##x     #define B(x) #@x     #define C(x) #x     我们假设:x=1,则有:     A(1)--

WangMark的专栏 5543

C语言宏定义##连接符和#符的使用

C语言中##什么意思, 比如说#define SHORT_REC_ADR_INIT(a) {ad_rec[a].slave_address = SPI_AD_DATA_ ## a ## _BASE;},这是什么意思? ##在C/C++中具有连接字符串的作用。例如: 执行完A ## B后变为AB(连接A和B并去掉空格)。 下面通过具体实例来说明##的工作原理: 假设程序中已经定义了这样一个带参数...

phenixyf的专栏 797
上一篇: 技术细节点滴
下一篇: TTTAttributedLabel 中的一些bug
Thinkbig
博客等级 码龄19年 5粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值