﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-zhuzhu2008-文章分类-c/c++/vc</title><link>http://www.cnitblog.com/zhuzhu2008/category/7831.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 30 Sep 2011 18:34:06 GMT</lastBuildDate><pubDate>Fri, 30 Sep 2011 18:34:06 GMT</pubDate><ttl>60</ttl><item><title>关于c++中的宏</title><link>http://www.cnitblog.com/zhuzhu2008/articles/51696.html</link><dc:creator>猪猪</dc:creator><author>猪猪</author><pubDate>Wed, 19 Nov 2008 14:31:00 GMT</pubDate><guid>http://www.cnitblog.com/zhuzhu2008/articles/51696.html</guid><wfw:comment>http://www.cnitblog.com/zhuzhu2008/comments/51696.html</wfw:comment><comments>http://www.cnitblog.com/zhuzhu2008/articles/51696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhuzhu2008/comments/commentRss/51696.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhuzhu2008/services/trackbacks/51696.html</trackback:ping><description><![CDATA[网上搜到的一些回复：<br><br>很多程序员不知道<span twffan="done">C</span>中的&#8220;宏&#8221;到底是什么意思？特别是<span class=GramE twffan="done">当宏有参数</span>的时候，经常把宏和函数混淆。我想在这里我还是先讲讲&#8220;宏&#8221;，<span class=GramE twffan="done">宏只是</span>一种定义，他定义了一个语句块，当程序编译时，编译器首先要执行一个&#8220;替换&#8221;源程序的动作，把宏引用的地方替换成宏定义的语句块，就像文本文件替换一样。这个动作术语叫&#8220;宏的展开&#8221;。使用宏是比较&#8220;危险&#8221;的，因为你不知道<span class=GramE twffan="done">宏展开</span>后会是什么一个样子。例如下面这个宏：<span twffan="done"><br><span twffan="done"></span><span twffan="done"></span>#define MAX(a, b) a&gt;<span class=SpellE twffan="done">b?a:b</span><br></span>当我们这样使用宏时，没有什么问题：<span twffan="done"> MAX( num1, num2 ); </span>因为<span class=GramE twffan="done">宏展开</span>后变成<span twffan="done"> num1&gt;num2?num1:num2</span>；。 但是，如果是这样调用的，<span twffan="done">MAX( 17+32, 25+21); </span>呢，编译时出现错误，原因是，<span class=GramE twffan="done">宏展开</span>后变成：<span twffan="done">17+32&gt;25+21<span class=GramE twffan="done">?17</span>+32:25+21</span>，<span class=SpellE twffan="done"><span twffan="done">Woh</span></span>，这是什么啊？<span twffan="done"><br></span>所以，宏在使用时，参数一定要加上括号，上述的那个例子改成如下所示就能解决问题了。<span twffan="done"><br><span twffan="done"></span><span twffan="done"></span>#define MAX( (a), (b) ) (a)&gt;(b)?(a)b)<br></span>即使是这样，也<span class=GramE twffan="done">不</span>这个宏也还是有<span twffan="done">Bug</span>，因为如果我这样调用<span twffan="done"> MAX(<span class=SpellE twffan="done">i++,j</span>++); </span>， 经过这个宏以后，<span class=SpellE twffan="done"><span twffan="done">i</span></span>和<span twffan="done">j</span>都被累加了两次，这绝不是我们想要的。所以，在宏的使用上还是要谨慎考虑，因为<span class=GramE twffan="done">宏展开</span>是的结果是很难让人预料的。而且虽然，宏的执行很快（因为没有函数调用的开销），<span class=GramE twffan="done">但宏会让</span>源代码<span class=GramE twffan="done">澎</span>涨，使目标文件尺寸变大，（如：一个<span twffan="done">50</span>行的宏，程序中有<span twffan="done">1000</span>个地方用到，<span class=GramE twffan="done">宏展开</span>后会很不得了），相反不能让程序执行得更快（因为执行文件变大，运行时系统换页频繁）。<span twffan="done"><br></span>因此，在决定是用函数，还是用宏时得要小心。<br><br>1.<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">宏</strong>定义比较直观，简洁，易懂，用起来也方便，而且大家都已经习惯用<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">宏</strong>了。。。还有就是一些如条件编译等只能用<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">宏</strong>来做。 <br>2.(__BORLANDC__)像这种的应该是编译器或者操作系统里包含有该信息，如_WIN32。如果不是的话，那么应在使用处#define 该<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">宏</strong>，如果使用到的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">宏</strong>定义很多的话，可以在外面另写一个def.h文件，将各种可能的#define 包含进去。 <br><br>个人见解。。。<br><br><strong><font style="BACKGROUND-COLOR: #a0ffff">宏</font></strong>是杀手,^_^.. <br>比如:#define private public<br>
<img src ="http://www.cnitblog.com/zhuzhu2008/aggbug/51696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhuzhu2008/" target="_blank">猪猪</a> 2008-11-19 22:31 <a href="http://www.cnitblog.com/zhuzhu2008/articles/51696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>