介绍
这期内容当中小编将会给大家带来有关详c++中解的#,# #和,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
在学习<代码> # 代码>和<代码> # # 代码>之前,先来看一个关于“的例子:
# include & lt; stdio.h> # include & lt; string.h> int main () { const char * p1=澳愫?““世界!“;//一个空格 const char * p2=澳愫?““世界!“;//多个空格 const char * p3=澳愫?”“世界!“;//没有空格 const char * p4=癏ello, World !“;//一个整串 const char * p5=澳愫?”“诗杰!“//一个不同的串 printf (“p1=% s, strlen (p1)=% d \ n", p1, strlen (p1)); printf (“p2=% s, strlen (p2)=% d \ n", p2, strlen (p2)); printf (“p3=% s, strlen (p3)=% d \ n", p3, strlen (p3)); printf (“p4=% s, strlen (p4)=% d \ n", p4, strlen (p4)); printf (“p5=% s, strlen (p5)=% d \ n", p5, strlen (p5)); 返回0; }
输出为:
p1=你好,世界!strlen (p1)=12,
引用>
p2=你好,世界!strlen (p2)=12,
p3=你好,世界!strlen (p3)=12,
p4=你好,世界!strlen (p4)=12,
p5=你好,运输代理!strlen (p5)=13,查看体育文件的常量字符串段,发现经过编译器优化后只存在一个<代码>你好,世界> 代码!串。
![]()
即p1, p2, p3, p4这四种写法是等价的,这一点作为之后解释<代码> #> 代码用法的前提。
当用作字符串化操作时,<代码> #> 代码的主要作用是将宏参数不经扩展地转换成字符串常量。
要点:
<李>宏定义参数的左右两边的空格会被忽略,参数的各个令牌之间的多个空格会被转换成一个空格。李> <李>宏定义参数中含有需要特殊含义字符如“或\时,它们前面会自动被加上转义字符\。李>
还是通过MSDN上的例子来看看容易懂:
# define F abc #定义B def #定义FB (arg) #参数 #定义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"标记连接操作(# #)
将多个令牌连接成一个令牌。
要点:<李>它不能是宏定义中的第一个或最后一个令牌。李> <李>前后的空格可有可无。李>
来理解一下MSDN上举的例子:
# include & lt; stdio.h> #定义贴纸(n) printf_s (“token"# n“;=% d"标记# # n) int token9=9; int main () { 贴纸(9); }<代码>贴纸(9);> 代码的预处理步骤应该如下:
<李>贴纸(9);李> <李> printf_s (“token"# 9“=% d"标记# # 9);李> <李> printf_s (“token"“9”;“;=% d" token9); 李> <李> printf_s (“token9=% d", token9); 李>
这样应该就很好理解了。
上述就是小编为大家分享的详c++中解的#,# #和了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
详c++中解的# # #和