C语言连接符号##和#解析_c语言#与##连接符-程序员宅基地

技术标签: 扩展  语言  c  编译器  C语言编程  工作  token  

宏定义中的## 连接符与# 符
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串
。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子。
假设程序中已经定义了这样一个带参数的宏:
#define paster( n ) printf( "token" #n " = %d", token##n )
同时又定义了一个整形变量:
int token9 = 9;
现在在主程序中以下面的方式调用这个宏:
paster( 9 );
那么在编译时,上面的这句话被扩展为:
printf( "token" "9" " = %d", token9 );
注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
可想而知,上面程序运行的结果就是在屏幕上打印出token9=9
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yuan1125/article/details/7051750

智能推荐

Android6,android学习网站-程序员宅基地

文章浏览阅读150次。2.1 怎么适配● 在6.0所有权限都需要申请?曰:当然不是。只有属于危险权限的才需要申请。危险权限看下表1-2● 那危险权限也很多啊,也要一个个申请?曰:当然不是。你看看下面的表,都分好组了(9组),对于同一组内的权限,只要有一个被同意,其他的都会被同意。● 谁最帅曰:当然是子信。2.2 列举权限的分组表1-2危险权限分组分组名字分割线PHONEandroid.permission.READ_PHONE_STATEandroid.permission.C_android学习网站

SpringBoot与RocketMQ客户端集成原理解读与示例-程序员宅基地

文章浏览阅读280次。本文将对rocktmq-spring-boot的设计实现做一个简单的介绍,读者可以通过本文了解将RocketMQ Client端集成为spring-boot-starter框架的开发细节,然后通过一个简单的示例来一步一步的讲解如何使用这个spring-boot-starter工具包来配置,发送和消费RocketMQ消息。该项目git地址:https://..._springboot rocketmq的原理

XAMPP中Apache安装SSL证书(Windows Server)_xampp ssl-程序员宅基地

文章浏览阅读3.1k次。什么是SSL证书?SSL证书是一种数字签证,遵从SSL协议,对服务器身份和传输的数据进行加密,使访问更加安全可靠。大家现在访问的所有网站都会使用Https协议,其实就是在Http外边加了一个SSL的外壳,使数据更加安全,同时浏览器可以根据SSL证书来显示网站是否安全等等,谷歌,火狐等浏览器都会在网址的前边提醒用户是否是安全连接。安装完SSL证书就可以用Https进行访问网站了。一般生成证书会选..._xampp ssl

padding的使用-程序员宅基地

文章浏览阅读198次。2019独角兽企业重金招聘Python工程师标准>>> ..._padding只能加给block吗?

android SDK安装代理设置-程序员宅基地

文章浏览阅读496次。 听说google earth 没经China gev的允许而拍摄到了其军事基地(据说就是2012中的诺亚方舟的建造基地),所以将google赶出了China。进而屏蔽google的一些重要IP地址。android SDK 的下载地址便成了本次政治博弈的牺牲品。大陆的developer无法通过正常的方式安装SDK,必须要进行代理地址设置才可以。具体状况如下:运行SDK Setup.exe后会..._sdk安装要代理吗

嵌入式 uboot通过CMD_LINE传参给kernel以及kernel启动分析_uboot kernel command line-程序员宅基地

文章浏览阅读4.7k次。Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常见的就是cmdline。以前我在启动内核的时候习惯性的通过uboot传递一个cmdline给内核,没有具体的分析这个过程。最近在分析内核启动过程的时候,重新看了一下内核启动参数的传递过程,彻底解决一下在这方面的疑惑。 一、bootloader_uboot kernel command line

随便推点

MISRA C指导指南解读系列7(MISRA C规则68-86) _一个函数在最后应该有一个单一的退出点-程序员宅基地

文章浏览阅读1.5k次。 2.1. 函数68.函数的声明应该是在文件的范围内(R) 例如 void myfunc(void) { extern int call(void); /* 违反规则68 */} 69.函数不能使用可变参数格式的样式(_一个函数在最后应该有一个单一的退出点

云计算学习入门:互操作性与可移植性讲解-程序员宅基地

文章浏览阅读509次。不同于传统的位于单位组织内部的 IT 基础设施,云计算的诞生给单位组织的 IT 资源供给带来了前所未有的灵活性——可以瞬时增加、转移或者减少计算资源来快速响应动态的资源需求变化,能在几个小时而不是几周内部署一个新的应用来满足业务需求。为了达到这种更具弹性的计算能力,在设计任何云系统时必须要考虑互操作性与可移植性。互操作性规定,IT 系统中应用软件层以下各层采用开放的通用型组件,杜绝使用云服务提供商各自内部的封闭组件。可移植性规定,IT 系统中应用软件层和数据信息层应采用开放的通用数据格式..

译:6.RabbitMQ Java Client 之 Remote procedure call (RPC,远程过程调用)-程序员宅基地

文章浏览阅读50次。在译:2. RabbitMQ 之Work Queues (工作队列) 我们学习了如何使用工作队列在多个工作人员之间分配耗时的任务。但是如果我们需要在远程计算机上运行一个函数并等待结果呢?嗯,这是一个不同的故事。此模式通常称为远程过程调用或RPC。在本教程中,我们将使用RabbitMQ构建RPC系统:客户端和可伸缩的RPC服务器。由于我们没有任何值得分发的耗时任务,我们将创建..._fibonaccirpc.call("30");

【libuv高效编程】libuv学习超详细教程6 ——libuv check 检查句柄解读_libuv example-程序员宅基地

文章浏览阅读1.6k次。check handle可以被译为检查句柄,如果程序中启动了check handle后,在事件循环中,每当I/O循环退出阻塞的时候都会被执行一遍,它与prepare刚好是相互呼应的,prepare是在I/O循环进入阻塞前,check是在I/O循环退出阻塞后被调用。_libuv example

BZOJ 2384: [Ceoi2011]Match KMP+树状数组-程序员宅基地

文章浏览阅读118次。这道题是 KMP 来转移子串中的相对排名. 然后查询排名的话需要用到树状数组. 如果跳 fail 指针的话要把没用元素全部删掉. code:#include <bits/stdc++.h> #define N 1005000 #define setI(s) freopen(s".in","r",stdin) using name..._bzoj2384

diskgenius创建efi分区_怎么创建efi系统分区?efi系统分区创建教程-程序员宅基地

文章浏览阅读7.7k次。[文章导读]近两年出来的的电脑不管是新台式机还是笔记本电脑,绝大多数是uefi主板,要采用对应的硬盘分区是gpt格式的,所以我们一定要记得采用efi引导对应的分区类型一定是gpt分区,EFI分区是GPT磁盘分区表里面的一个必要分区,是独立于系统之外的分区,即使系统崩溃了,里面的文件也不会丢失,它的格式可以是FAT16/FAT32两种,前者速度更快后者支持的文件大小可以接近4GB。当然除非有特殊情况..._diskgenius创建efi分区

推荐文章

热门文章

相关标签