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

ANSYS Fluent 2023R2实战:用欧拉多相流模型搞定流化床模拟(附详细参数避坑)

本文详细解析了ANSYS Fluent 2023R2中欧拉多相流模型在流化床模拟中的应用,包括模型选择、材料属性设置、相间作用力配置及初始化技巧。特别针对高颗粒浓度工况提供参数优化方案,帮助工程师提升模拟精度与效率,适用于化工、能源等领域的流化床反应器设计。

weixin_30938149的博客 268

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

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 779

电子硬件仿真:设计一个频率范围为10k—50k的带通滤波器

带通滤波器是一种常用的滤波器类型,具有选择特定频率范围内信号的能力,并在该范围内提供一定的增益。它允许通过一定范围内的频率信号,并在该范围内提供一定的增益,同时在该范围之外的频率上提供较高的衰减。这意味着在通带内(10kHz至50kHz),滤波器的增益应为10dB,而在每个十倍频的频率点上,滤波器的增益应降低40dB。设计滤波器:使用滤波器设计工具(如MATLAB、Python的scipy库、Tina软件等),根据选定的滤波器类型(例如巴特沃斯滤波器),中心频率和通带宽度,设计一个4阶带通滤波器。

走向CTO的路上... 579

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

SAP 批次管理(分割评估)

批次分割评估: 业务场景:企业要求各批次物料成本价格不一样。此时可以采用分割批次来实现不同成本 后台配置: (1)、激活分割评估 后台---物料管理----评估与科目设置---分割评估-----激活分割评估 (2)、配置分割评估 后台---物料管理----评估与科目设置---分割评估-----配置分割评估 进入全局性分类后,批次分割采用已有的评估类型“X自动(批)”: ...

willieyuan的博客 1万+
上一篇: 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、付费专栏及课程。

余额充值