时间:2021-05-19
想要灵活应用宏,离不开#和##。
"
在学习#和##之前,先来看一个关于"的例子:
输出为:
p1 = Hello,World!, strlen(p1) = 12
p2 = Hello,World!, strlen(p2) = 12
p3 = Hello,World!, strlen(p3) = 12
p4 = Hello,World!, strlen(p4) = 12
p5 = Nihao,Shijie!, strlen(p5) = 13
查看PE文件的常量字符串段,发现经过编译器优化后只存在一个Hello,World!串。
即p1,p2,p3,p4这四种写法是等价的,这一点作为之后解释#用法的前提。
字符串化操作(#)
当用作字符串化操作时,#的主要作用是将宏参数不经扩展地转换成字符串常量。
要点:
还是通过MSDN上的例子来看看容易懂:
#define F abc #define B def #define FB(arg) #arg #define FB1(arg) FB(arg) FB(F B) FB1(F B)初看到时推测这两行预编译出来后效果是一样的,但是看了使用gcc -E编译出来代码,这才理解了MSDN上对“不经扩展”有了更深刻的理解,实际的预编译后代码为:
"F B"; "abc def";推测变换过程应该如下:
FB(F B) --> #F B -->"F B" FB1(F B) --> FB1(abc def) --> FB(abc def) --> #abc def --> "abc def"标记连接操作(##)
将多个Token连接成一个Token。
要点:
来理解一下MSDN上举的例子:
#include <stdio.h> #define paster( n ) printf_s( "token" #n " = %d", token##n ) int token9 = 9; int main() { paster(9); }paster(9);的预处理步骤应该如下:
这样应该就很好理解了。
参考MSDN
Stringizing Operator(#) : http://msdn.microsoft.com/EN-US/library/7e3a913x(v=VS.110,d=hv.2).aspx
Token-Pasting Operator(##) : http://msdn.microsoft.com/EN-US/library/09dwwt6y(v=VS.110,d=hv.2).aspx
到此这篇关于C++中的#,##,和"的文章就介绍到这了,更多相关C++中的#,##,和"内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文较为深入的探讨了C++继承中的访问控制,对深入掌握C++面向对象程序设计是非常必要的。具体内容如下:通常来说,我们认为一个类有两种不同的用户:普通用户和类的
命名空间是C++非常重要的概念,本文就以实例形式对其进行深入分析,具体内容如下:通常来说,在C++中,命名空间(namespace)的目的是为了防止名字冲突。每
本文实例讲解了C++中基类和派生类之间的转换。对于深入理解C++面向对象程序设计有一定的帮助作用。此处需要注意:本文实例讲解内容的前提是派生类继承基类的方式是公
C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。C++中的结构体和类的异同:
C++中构造函数的实例详解c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++