blob: 85979c16a6481edd2edf1ea1645550aa158cc664 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="author" content="Nikolay.Krasilnikov@oracle.com">
<meta name="description" content="A short guide to macro features in C/C++ projects in
NetBeans IDE or Oracle Solaris Studio IDE.">
<meta name="keywords" content="NetBeans, IDE, macros,
tutorial, guide, user, documentation, open source, C, C++, make, dbx, gdb">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<title>了解 C/C++ 项目中的宏 - NetBeans IDE 教程</title>
</head>
<body style="padding: 2px;">
<h1>了解 C/C++ 项目中的宏 - NetBeans IDE 教程</h1>
<div class="articledate" style="margin-left: 0px;font-style:italic;">
<p><em>撰稿人:<a href="mailto:Nikolay.Krasilnikov@oracle.com"><i>Nikolay Krasilnikov</i></a> <br> 2013 年 10 月</em> [修订版本号:V7.4-1]</div>
<p>本教程将向您介绍如何使用 NetBeans IDE 的新增功能检查和调试包含宏的代码。</p>
<p><b>目录</b></p>
<img alt="此页上的内容适用于 NetBeans IDE 7.3 和 7.4" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-74-73.png" title="此页上的内容适用于 NetBeans IDE 7.3 和 7.4">
<ul class="toc">
<li><a href="#requirements">要求</a></li>
<li><a href="#investigate">检查使用宏的代码</a></li>
<li><a href="#debug">调试使用宏的代码</a></li>
</ul>
<h2><a name="requirements"></a>要求</h2>
<p><b>要学习本教程,您需要具备以下软件和资源。</b> </p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1">NetBeans IDE</td>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">带有 NetBeans C/C++ 插件的版本 7.3 或 7.4</a></td>
</tr>
<tr>
<td class="tbltd1">Java 开发者工具包 (JDK)</td>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">版本 6 或 7</a></td>
</tr>
</table>
<p>有关下载并安装所需软件的信息,请参见 <a href="../../../community/releases/74/install.html">NetBeans IDE 安装说明</a><a HREF="../../../community/releases/74/cpp-setup-instructions.html">配置 NetBeans IDE 以使用 C/C++/Fortran</a><br>
</p>
<h2><a name="investigate"></a>检查使用宏的代码</h2>
<p>宏显示为超链接,因此当您按住 Ctrl 键单击宏时,IDE 将打开定义宏的头文件。但有时对于简单的宏(例如数值常量或字符串型),您可能只想快速地查看宏定义。</p>
<p>
NetBeans IDE 提供了两项功能,用于快速浏览包含宏的源代码:</p>
<ul>
<li>宏工具提示(适用于简短的宏)</li>
<li>宏扩展窗口(适用于较复杂的宏)</li>
</ul>
<h3><a name="tooltips"></a>使用宏工具提示处理简单的宏</h3>
<p>使用宏工具提示,可以在小型的弹出式窗口中进行查看,而无需打开另一个文件。
</p>
<p><b>要激活宏工具提示以便查看其扩展,请执行以下操作:</b></p>
<ol><li>按住 Ctrl+Alt 组合键。</li>
<li>将鼠标光标置于要扩展的宏上,随即会打开一个工具提示以显示扩展信息,如下图中所示。</li>
</ol>
<P><img SRC="../../../images_www/articles/73/cnd/macros/macro-tooltip.png" alt="宏工具提示扩展" class="b-all margin-around"></P>
<h3>使用宏扩展窗口处理复杂的宏</h3>
<p>
使用宏扩展视图,可以检查包含复杂的多行宏的源代码。宏通常用于定义常量,但也可用于定义使用方法与函数类似的代码片段。在处理以这种方式使用宏的代码时,可能很难理解该代码所执行的操作。您可能需要在调用宏的源代码的上下文中检查该宏。
</p>
<p><b>要查看包含扩展宏代码的源代码,请执行以下操作:</b></p>
<ul>
<li>右键单击该宏,然后从弹出式菜单中选择 "Navigate -> View Macro Expansion"(导航 -> 查看宏扩展)。<br> "Macro Expansion"(宏扩展)窗口随即打开,其中在调用扩展宏的代码的上下文中显示了该宏。</li>
<li>您也可以按 Ctrl+Alt 组合键,同时将鼠标光标置于要查看的代码上,然后单击超链接以打开 "Macro Expansion"(宏扩展)窗口。</li>
</ul>
<p>下图显示了 "Macro Expansion"(宏扩展)窗口。</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-expansion.png" alt="宏扩展视图" class="b-all margin-around">
</p>
<p>
在 "Macro Expansion"(宏扩展)窗口中,宏内容位于保护块内。对于扩展的代码,提供了语义突出显示功能。可以使用 "Macro Expansion"(宏扩展)窗口中的超链接转至其他源文件。此外,还对使用的宏参数进行了突出显示。
</p>
<p>
"Macro Expansion"(宏扩展)窗口的左边栏包含一些工具栏按钮:</p>
<ul>
<li>使脱字号、内容和上下文同步<br> 此选项可使编辑器窗口和 "Macro Expansion"(宏扩展)窗口中源文件内的脱字号位置和内容保持同步。<br> 它还会更改上下文以使其与脱字号的位置相关(如果选择了 "expand local context only"(仅扩展本地上下文))。
</li><li>仅扩展本地上下文:仅在 "Macro Expansion"(宏扩展)窗口中扩展脱字号所在的代码块中的宏。
</li>
<li>扩展整个文件:<br> 在 "Macro Expansion"(宏扩展)窗口中扩展源文件中的所有宏。
</li>
<li>向上箭头和向下箭头:<br> 使用这些按钮可以快速导航至下一个宏或上一个宏。</li>
</ul>
<h2><a name="debug"></a>调试使用宏的代码</h2>
<p>
有时,只理解宏的含义是不够的。<br> 例如,假定您要调试以下代码:
</p>
<pre>#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;
#define ID_FIRST (0)
#define ID_ALICE (ID_FIRST)
#define ID_BOB (ID_ALICE + 1)
#define ID_TOM (ID_BOB + 1)
#define ID_FRINDS_NUMBER (ID_TOM + 1)
#define NEXT_PERSON(id) (id + 1)
#define PREV_PERSON(id) (id - 1)
using namespace std;
/*
* Main function
*/
int main(int argc, char** argv) {
int person = ID_TOM;
if (NEXT_PERSON(person) == ID_FRINDS_NUMBER) {
cout &lt;&lt; "last person";
}
return (EXIT_SUCCESS);
}
</pre>
<p>
假定您在 <tt>if</tt> 语句上停止了调试器,想知道程序是否会输出 "last person"。
</p>
<p>
宏扩展工具提示将显示 <tt>ID_FRINDS_NUMBER</tt> 为 "<tt>(((((0))+ 1)+ 1)+ 1)</tt>"。<br> <tt>ID_FRINDS_NUMBER</tt> 是多少?在这种简单的情况下,很容易说出 <tt>ID_FRINDS_NUMBER</tt> 的值是 3,但是如果有两千人,就不会这么容易了。
</p>
<p>您可能会发现它对于在调试时估算宏中的表达式会非常有用,如下所述。</p>
<h3>使用工具提示估算宏</h3>
<p>
可以在调试器中对包含宏的表达式使用表达式求值。<br> 将鼠标指针悬停在 <tt>ID_FRINDS_NUMBER</tt> 之上,您会看到下图中显示的内容:<br>
</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-debugging-expression-evaluation.png" alt="宏表达式求值" class="b-all margin-around">
</p>
<p>
您也可以选择整个表达式,然后将鼠标光标移到其上方以在工具提示中对表达式求值,如下图中所示:<br>
</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-debugging-expression-evaluation-2.png" alt="宏表达式求值" class="b-all margin-around">
</p>
<p class="tips">
在工具提示中估算宏时务必要小心,因为这种求值方式可能会更改程序的状态。例如,在估算扩展为 <tt>i++</tt> 的宏时,将递增 <tt>i</tt> 的值。
</p>
<h3>使用监视估算宏</h3>
<p>
可以在调试器监视中使用宏,如下图所示:<br>
</p>
<p>
<img SRC="../../../images_www/articles/73/cnd/macros/macro-debugging-watches.png" alt="宏调试监视" class="b-all margin-around">
</p>
<p class="tips">
在监视中估算宏时务必要小心,因为这种求值方式可能会更改程序的状态。例如,在估算扩展为 <tt>i++</tt> 的宏时,将递增 <tt>i</tt> 的值。
</p>
<h2>另请参见</h2>
<p>有关在 NetBeans IDE 中使用 C/C++/Fortran 进行开发的更多文章,请参见 <a href="https://netbeans.org/kb/trails/cnd.html">C/C++ 学习资源</a></p>
<div class="feedback-box"><a href="mailto:users@cnd.netbeans.org?subject=Feedback:%20Exploring%20Macros%20in%20C/C++%20Projects%20-%20NetBeans%20IDE%207.4%20Tutorial">发送有关此教程的反馈意见</a></div>
</body>
</html>