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

C语言连接符--## 是一个连接符(concatenation operator),也被称为“粘贴”或“尖括号-井号”运算符。它主要在宏定义和条件编译中使用,用于连接两个标记(tokens)。运算符只能连接标记,而不能连接字符串字面量或其他非标记实体。在C语言的预处理器(preprocessor)中,时要小心,确保在宏展开后不会产生无效的C代码。会“吃掉”它后面的标记(在这种情况下是。会被扩展为空,因此会正常定义。),从而不定义该变量。在上述第二个例子中,如果。 阅读详情


1.[c/c++]宏定义,#,##_believefym的博客-优快云博客

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

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

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

int token9 = 9;

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

paster( 9 );

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

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

详细解说:#n 相当于 “n”, 2##n 相当于29,须注意##不能当成两个#,他们意义是不同的。

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

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

注意##和#的使用场合,不能乱用。

# —— 字符串
##——连接两个参数

实例:

#include<iostream>
using namespace std;
#define TEST(pid) (cout<<para##pid<<endl)
#define TEST2(p) (cout<<#p<<endl)
int _tmain(int argc,TCHAR ** argv)
{
	int para3 = 3;
	int para2 = 2;
	TEST(2); //cout<<para2<<endl; 输出:2
	TEST(3); //cout<<para3<<endl; 输出:3
	TEST2(test) ;//cout<<"test"<<endl; 输出:test
	TEST2("test2"); //cout<<""test2""<<endl; 输出:“test2”
	return 1;
}

本文转自:C++/C宏定义中## 连接符与# 符的含义 - qinfengxiaoyue - 博客园 (cnblogs.com)

小知识:C语言宏定义中 # 和 ## 符号的用法 在某些C语言代码中,有时我们可能会看到宏定义中带有#、##,这些符号有特殊的作用,下面我们用几个简单的例子来说明。 1)一个#的作用 一个#的作用就是把后面的参数当做一个字符串,也就是说等同于把后面的宏变量加上双引号: 运行上述代码,可以得到输出: Hello world 1 Hello world 2 说明 #define PRINT(NAME) printf(#NAME)这个宏,等同于把NAME加上了双引号“”,即替换成了“NAME”,所以,第一个PRINT可以直接把括号内的内容.. 阅读详情

相关推荐

C语言中的##连接符与#符

符号可以将宏参数转换为字符串常量,使得在宏定义中将参数的值转换为字符串成为可能。通过灵活运用这两个符号,我们可以编写更加通用和灵活的宏定义,提高代码的可读性和可维护性。C语言中的##连接符和#符号是预处理器中的两个特殊符号,它们在宏定义中起到了重要的作用。通过使用#符号,我们可以在宏定义中将参数的值转换为字符串常量,这在某些情况下非常有用,比如在日志输出或者错误处理中。可以看到,通过使用##连接符,我们可以在宏定义中动态地生成变量名或者其他标识符,从而增加了宏的灵活性和通用性。

HackDashX的博客 571

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

http://feihe027.blog.163.com/blog/static/593258332010329104333781/宏定义中的井号1)# 只在有参数的定义时用到,为把参数产开并转化成字符串即用""引起来。里面的空格分割全部改为一个,并且会自动添加转义字符'\'2)

Thinkbig的专栏 4377

STM32CubeIDE入坑指南

一 前言 在科技日新月异的今天,作为从事效率为先的苦逼 IT 行业,秉承着我不入地狱谁入地狱的伟大革命精神,我决定再一次做第一个吃螃蟹的人,通过自身的入坑过程,为大家测试STM32CubeIDE这款新式工具。(其实是为了我能省点时间,快点做完项目,多挣点钱买几瓶肾气丸) 二 看一看别人是如何入坑的 二 手把手带你入坑 三 相关资料 ...

CH的博客 1万+

c语言宏字符连接嵌套,C语言宏定义##链接符和#符的使用

#include数组#define f(a,b) a##bide#define g(a) #a函数#define h(a) g(a)uiint main()lua{spaprintf("%s\n",h(f(1,2)));.netprintf("%s\n",g(f(1,2)));翻译return 0;指针}在宏定义里,a##b就是把a,b联接起来,好比f(1,2)就是12,可是是数。#a就是把a转化...

weixin_30953869的博客 1187

VMware ESXi +DELL虚拟化存储磁盘容量处于紧急状态问题的处理

1、环境介绍 exsi server两台(DELL R730 ): 192.168.3.206 VMware EXSi6.5 192.168.3.207 VMware EXSi6.5 磁盘存储柜一台(DELL SC2000): 192.168.3.208 2、故障处理 由于前期规划的卷空间过大,虚拟机文件逐年增大以后,造成卷的磁盘占用过与整个磁盘空间的容量,虚拟化平台可用容量爆掉,DELL SC2000自动切换到紧急状态,禁止所有磁盘I/O,exsi主机上的虚拟机无法开机 首先,安装

wolf1105的博客 3531

RK3588与FPGA高速PCIe通信:从理论带宽到实战优化的全流程解析

本文深入解析了瑞芯微RK3588与FPGA之间基于PCIe Gen2的高速通信全流程。从理论带宽计算(约1640MB/s)出发,详细拆解了硬件连接、驱动加载、DMA配置等关键步骤,并重点分享了中断优化、内存管理及高级调优等实战技巧,旨在帮助开发者从“跑通”到“跑好”,实现接近理论极限的稳定高效数据传输。

weixin_29175469的博客 332

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

C/C++中export的定义 分类: 编程知识收集 2004-08-03 17:47 1718人阅读 评论(0) 收藏 举报 C/C++中export的定义 Windows下的DLL、Linux下的库或是C++中调用C的库,均可能用到import/export。本文讨论一种通用的import/export宏定义的使用实践。 如下所示,"common.h"定义了

shuiyingzi5的专栏 1291

YOLOv8改进---BiFPN特征融合

yolov8结合BiFPN进行改进

qq_41920323的博客 4523
上一篇: QPainter类的CompositionMode各值含义
下一篇: QT_CONFIG宏用法及支持的参数
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值