<div id="blogContent" class="text-article">
<p>#进行宏字符串连接,<span style="color: #ff0000;">在宏中</span>
把参数解释为字符串,不可以在语句中直接使用。</p>
<p>在宏定义中</p>
<p>printf("%s;/n", #S) 会被解释为</p>
<p>printf("%s;/n", "S")</p>
<p>例如下面的代码</p>
<p> <span style="color: #ff0000;">code start</span>
</p>
<p>#define TRACE(S) (printf("%s;/n", #S), S) /*注意用逗号而不是分号*/</p>
<p> <br>
#include <stdio.h></p>
<p>#include <stdlib.h></p>
<p>#include <string.h></p>
<p> <br>
int main(){</p>
<p> int a=5;</p>
<p> int b=TRACE(a);</p>
<p> const char *str="hello";</p>
<p> char des[50];</p>
<p> strcpy(des,TRACE(str));</p>
<p> puts(des);</p>
<p> system("pause");</p>
<p> return 0;</p>
<p>}</p>
<p> <span style="color: #ff0000;">code end</span>
</p>
<p>输出结果为:</p>
<p>a;</p>
<p>str;</p>
<p>hello</p>
<p>同时宏定义又是一个<a href="http://blog.renren.com/blog/222277385/727594788" target="_blank">逗号表达式</a>
,所以拷贝到des里面的值为后面S也就是str的值。</p>
<p></p>
<p>又比如下面的解释:</p>
<p> <span>3</span>
<span>.宏的单行定义(少见用法) </span>
</p>
<p> <span></span>
<span>#define</span>
<span> A(x) T_##x</span>
<span> </span>
</p>
<p> <span>#define</span>
<span> B(x) #@x</span>
<span> </span>
</p>
<p> <span>#define</span>
<span> C(x) #x</span>
<span> </span>
</p>
<p> <span>我们假设:x</span>
<span>=</span>
<span>1</span>
<span>,则有: </span>
</p>
<p> <span> A(</span>
<span>1</span>
<span>)</span>
<span>------</span>
<span>〉T_1 </span>
</p>
<p> <span> B(</span>
<span>1</span>
<span>)</span>
<span>------</span>
<span>〉</span>
<span>'</span>
<span>1</span>
<span>'</span>
<span> </span>
</p>
<p> <span>C(</span>
<span>1</span>
<span>)</span>
<span>------</span>
<span>〉</span>
<span>"</span>
<span>1</span>
<span>"</span>
</p>
</div>
<p>#进行宏字符串连接,<span style="color: #ff0000;">在宏中</span>
把参数解释为字符串,不可以在语句中直接使用。</p>
<p>在宏定义中</p>
<p>printf("%s;/n", #S) 会被解释为</p>
<p>printf("%s;/n", "S")</p>
<p>例如下面的代码</p>
<p> <span style="color: #ff0000;">code start</span>
</p>
<p>#define TRACE(S) (printf("%s;/n", #S), S) /*注意用逗号而不是分号*/</p>
<p> <br>
#include <stdio.h></p>
<p>#include <stdlib.h></p>
<p>#include <string.h></p>
<p> <br>
int main(){</p>
<p> int a=5;</p>
<p> int b=TRACE(a);</p>
<p> const char *str="hello";</p>
<p> char des[50];</p>
<p> strcpy(des,TRACE(str));</p>
<p> puts(des);</p>
<p> system("pause");</p>
<p> return 0;</p>
<p>}</p>
<p> <span style="color: #ff0000;">code end</span>
</p>
<p>输出结果为:</p>
<p>a;</p>
<p>str;</p>
<p>hello</p>
<p>同时宏定义又是一个<a href="http://blog.renren.com/blog/222277385/727594788" target="_blank">逗号表达式</a>
,所以拷贝到des里面的值为后面S也就是str的值。</p>
<p></p>
<p>又比如下面的解释:</p>
<p> <span>3</span>
<span>.宏的单行定义(少见用法) </span>
</p>
<p> <span></span>
<span>#define</span>
<span> A(x) T_##x</span>
<span> </span>
</p>
<p> <span>#define</span>
<span> B(x) #@x</span>
<span> </span>
</p>
<p> <span>#define</span>
<span> C(x) #x</span>
<span> </span>
</p>
<p> <span>我们假设:x</span>
<span>=</span>
<span>1</span>
<span>,则有: </span>
</p>
<p> <span> A(</span>
<span>1</span>
<span>)</span>
<span>------</span>
<span>〉T_1 </span>
</p>
<p> <span> B(</span>
<span>1</span>
<span>)</span>
<span>------</span>
<span>〉</span>
<span>'</span>
<span>1</span>
<span>'</span>
<span> </span>
</p>
<p> <span>C(</span>
<span>1</span>
<span>)</span>
<span>------</span>
<span>〉</span>
<span>"</span>
<span>1</span>
<span>"</span>
</p>
</div>