// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= 编辑和导航 C/C++ 源文件 - NetBeans IDE 教程
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: 编辑和导航 C/C++ 源文件 - NetBeans IDE 教程 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, 编辑和导航 C/C++ 源文件 - NetBeans IDE 教程

_撰稿人：_Ann Rice_，维护人：_Susan Morgan_
2014 年 3 月_ [修订版本号：V8.0]

下面的简明教程介绍了 NetBeans IDE 中用于导航和编辑 C 或 C++ 项目源文件的一些功能。



image::images/netbeans-stamp-80-74.png[title="此页上的内容适用于 NetBeans IDE 7.4 和 8.0"]

|===
|- |<<requirements,要求>> 

|- |<<project,创建样例项目>> 

|- |<<editing,编辑 C 和 C++ 源文件>> 

|- |<<navigating,导航 C 和 C++ 源文件>> 

|- |<<nextsteps,后续步骤>> 
|===


== 要求

*要学习本教程，您需要具备以下软件和资源。*

|===
|软件或资源 |要求的版本 

|NetBeans IDE |link:https://netbeans.org/downloads/index.html[+ 带有 NetBeans C/C++ 插件的版本 7.4 或 8.0+] 

|Java 开发者工具包 (JDK) |link:http://java.sun.com/javase/downloads/index.jsp[+版本 7 或 8+] 
|===


请参见 link:../../../community/releases/80/install.html[+NetBeans IDE 8.0 安装说明+]和link:../../../community/releases/80/cpp-setup-instructions.html[+配置 NetBeans IDE 以使用 C/C++/Fortran+]，
以获取有关下载并安装所需软件的信息。

*样例项目*

只是想试用一些项目吗？在 IDE 中，选择“文件”>“新建项目”，然后依次打开“样例”类别和 "C/C++" 子类别。IDE 提供了一些 C 和 C++ 样例项目来帮助您熟悉 IDE。


== 创建样例项目

带有 C/C++ 插件的 NetBeans IDE 为修改源代码提供了高级编辑功能。为了说明这些功能，我们将以 ``报价`` 项目为例进行讲解。如果还没有创建这个项目，可执行以下操作：

1. 选择“文件”>“新建项目”。
2. 在项目向导中，展开“样例”类别，并选择 "C/C++" 子类别。
3. 选择 ``报价`` 项目。单击“下一步”，然后单击“完成”。


== 编辑 C 和 C++ 源文件


=== 设置格式样式

可以使用 "Options"（选项）窗口为 C 和 C++ 项目配置默认格式样式。

1. 选择 "Tools"（工具）> "Options"（选项）。
2. 在窗口的顶部窗格中单击 "Editor"（编辑器）。
3. 单击 "Formatting"（格式设置）标签。
4. 从 "Language"（语言）下拉列表中选择 "C++" 语言，因为 "Quote"（报价）项目使用 C++。
5. 从 "Style"（样式）下拉列表中选择要设置的样式。
image::images/formatting_style.png[]
6. 按您的想法修改样式属性。


=== 折叠 C 和 C++ 文件中的代码块

对于一些文件类型，可以使用代码折叠功能折叠代码块，这样源代码编辑器中只显示代码块中的第一行代码。

1. 在  ``Quote_1``  应用程序项目中，打开 Source Files 文件夹，然后双击  ``cpu.cc``  文件以在源代码编辑器中将其打开。
2. 单击左旁注中的折叠图标（标有减号的小方块），折叠其中一个方法的代码。
3. 将鼠标移动到折叠代码块右边的  ``{...}``  符号上，以显示代码块中的代码。 
image::images/code_folding.png[]


=== 使用语义突出显示

可以设置一个选项，当单击一个类、函数、变量或者宏时，在当前文件中出现这个类、函数、变量或宏的所有地方都会突出显示。

1. 选择 "Tools"（工具）> "Options"（选项）。
2. 在窗口的顶部窗格中单击 "Editor"（编辑器）。
3. 单击 "Highlighting"（突出显示）标签。
4. 确保所有复选框都包含复选标记。
5. 单击 "OK"（确定）。
6. 在  ``Quote_1``  项目的  ``customer.cc``  文件中，请注意方法名称以粗体突出显示。
7. 单击某个出现的  ``Customer``  类。
8. 文件中出现的所有  ``Customer``  类都将以黄色背景突出显示。右旁注还会显示一些标记，以指示文件中出现该类的位置。通过这些标记，您无需滚动查看整个文件，便可了解文件中存在多少该类。单击标记，可以跳转至它们所指示的实例位置。
image::images/highlighting1.png[]
9. 要在实例之间轻松地进行导航，请按 Alt+向下方向键转至下一个实例，或者按 Alt+向上方向键转至上一个实例。
10. 打开位于 "Headers"（头）文件夹中的  ``customer.h``  文件，您会看到类名同样以粗体突出显示。
image::images/highlighting2.png[]


=== 使用代码完成和文档

IDE 具有动态 C 和 C++ 代码完成功能，键入一个或多个字符之后，您会看到一个包含可能的类、方法、变量等的列表，可以从中选择所需内容来完成表达式。

IDE 还可动态搜索类、函数、方法等的文档，并在弹出式窗口中显示该文档。

1. 打开  ``Quote_1``  项目中的  ``quote.cc``  文件。
2. 在  ``quote.cc``  的第一个空行上，键入大写字母 C，然后按 Ctrl-空格组合键。代码完成框会显示一个简短列表，其中包含  ``Cpu``  和  ``Customer``  类。文档窗口也会打开，但显示 "No documentation found"（找不到文档），因为项目源文件中不包括其代码的文档。
3. 再次按 Ctrl-空格键以展开项目列表。 
image::images/code_completion1.png[]
4. 使用方向键或鼠标突出显示列表中的某个标准库函数（例如  ``calloc`` ）；如果 IDE 可以访问该函数的手册页，则文档窗口便会显示该手册页。
image::images/code-completion-documentation.png[]
5. 选择  ``Customer``  类，并按 Enter 键。
6. 键入  ``andrew;`` ，完成新的  ``Customer``  类实例。在下一行中，键入字母  ``a``  并按 Ctrl-空格键两次。代码完成框显示以字母  ``a``  开头的选择列表，例如可从当前上下文访问的方法参数、类字段和全局名。
image::images/code_completion2.png[]
7. 双击  ``andrew``  选项接受它，并在其后键入一个句点。按 Ctrl-空格键，将显示  ``Customer``  类的公共方法和字段的列表。
image::images/code_completion3.png[]
8. 删除添加的代码。


=== 添加源代码文档

您可以在代码中添加注释，以便自动为函数、类和方法生成文档。IDE 可以识别使用 Doxygen 语法的注释，并自动生成文档。IDE 还可以自动生成注释块，以在注释下面生成函数的文档。

1. 在  ``quote.cc``  文件中，将光标置于第 75 行或该行的上一行 
 ``int readNumberOf(const char* item, int min, int max) {`` 
2. 键入一个正斜杠和两个星号，然后按 Enter 键。编辑器会为  ``readNumberOf``  类插入一条 Doxygen 格式的注释。
image::images/doxygen_comment.png[]
3. 在每个 @param 行中添加一些描述性文本，然后保存该文件。 
image::images/doxygen_comment_edited.png[]
4. 单击  ``readNumberOf``  类以便以黄色突出显示，然后单击右侧的某一实例标记以跳至使用该类的位置。
5. 单击所跳转到的行中的  ``readNumberOf``  类，然后按 Ctrl-Shift-空格键以显示刚才为参数添加的文档。
image::images/doxygen_displayed.png[]
6. 单击该文件中的任意其他位置以关闭文档窗口，然后再次单击  ``readNumberOf``  类。
7. 选择 "Source"（源）> "Show Documentation"（显示文档）以再次打开该类的文档窗口。


=== 使用代码模板

源代码编辑器有一组可定制代码模板，可以定制常用的 C 和 C++ 代码片段。通过键入代码片段的缩写形式并按 Tab 键，可以生成完整的代码片段。例如，在  ``Quote``  项目的  ``quote.cc``  文件中：

1. 键入  ``uns``  后按 Tab 键， ``uns``  便会扩展为  ``unsigned`` 。
2. 键入  ``iff``  后按 Tab 键， ``iff``  便会扩展为  ``if (exp) {}`` 。
3. 键入  ``ife``  后按 Tab 键， ``ife``  便会扩展为  ``if (exp) {} else {}`` 。
4. 键入  ``fori``  后按 Tab 键， ``fori``  便会扩展为  ``for (int i = 0; i < size; i++) { Object elem = array[i];`` 。

查看所有可用的代码模板、修改代码模板、创建您自己的代码模板或选择不同键以便展开代码模板：

1. 选择 "Tools"（工具）> "Options"（选项）。
2. 在 "Options"（选项）对话框中，选择 "Editor"（编辑器），然后单击 "Code Templates"（代码模板）标签。
3. 从 "Language"（语言）下拉列表中选择相应语言。
image::images/code_templates.png[]


=== 用配对完成功能

当编辑 C 和 C++ 源文件时，源代码编辑器会“智能地”匹配成对的符号，比如方括号、圆括号和引号。当键入这些字符中的一个时，源代码编辑器会自动插入一个与之配对的结束字符。

1. 在  ``Quote_1``  项目的  ``module.cc``  文件中，将光标置于第 115 空行上，然后按回车键以打开一个新行。
2. 键入  ``enum state {``  并按 Return 键。结束的方括号和分号被自动添加，光标位于括号之间的行上。
3. 在括号之间的行上键入  ``invalid=0, success=1``  以完成枚举。
4. 在枚举的结束  ``};``  之后的行上键入  ``if (`` ，然后您应该会看到自动添加了一个结束圆括号，并且光标置于圆括号之间。
5. 在圆括号之间键入  ``v==null`` 。然后在右圆括号之后键入  ``{``  和换行符。结束括号被自动添加。
6. 删除添加的代码。


=== 在项目文件中查找文本

可以使用 "Find In Projects"（在项目中查找）对话框在项目中搜索指定文本或正则表达式的实例。

1. 通过执行以下某一操作，打开 "Find In Projects"（在项目中查找）对话框：
* 选择 "Edit"（编辑）> "Find In Projects"（在项目中查找）。
* 在 "Projects"（项目）窗口中右键单击项目，然后选择 "Find"（查找）。
* 按 Ctrl+Shift+F 组合键。
2. 在 "Find In Projects"（在项目中查找）对话框中，选择 "Default Search"（默认搜索）标签或 "Grep" 标签。"Grep" 标签使用  ``grep``  实用程序，该实用程序提供较快的搜索，尤其适用于远程项目。
image::images/find_in_projects.png[]
3. 在 "Grep" 标签中，键入要搜索的文本或正则表达式，指定搜索范围和文件名模式，然后选中 "Open in New Tab"（在新标签中打开）复选框，这样您就可以在单独的标签中保存多个搜索。
4. 单击 "Find"（查找）。
"Search Results"（搜索结果）标签会列出已在其中找到相应文本或正则表达式的文件。

使用左旁注中的按钮可以更改搜索结果的视图。

image::images/find_in_projects2.png[]
5. 单击 "Expand/Collapse"（展开/折叠）按钮可折叠文件列表，以便只显示文件名。单击其他按钮可以目录树形式或文件列表形式显示搜索结果。这些选项在跨多个项目执行搜索时非常有用。
6. 双击列表中的某一项，IDE 将转到源代码编辑器中的对应位置。


== 导航 C 和 C++ 源文件

带有 C/C++ 插件的 NetBeans IDE 为查看源代码提供了高级导航功能。要了解这些功能，请继续使用  ``Quote_1``  项目。


=== 使用 "Classes"（类）窗口

"Classes"（类）窗口可以使您看到项目中的所有类，以及每个类的成员和字段。

1. 单击 "Classes"（类）标签显示 "Classes"（类）窗口。如果未显示 "Classes"（类）标签，请选择 "Window"（窗口）> "Classes"（类）
2. 展开 "Classes"（类）窗口中的  ``Quote_1``  节点。项目中所有类都会被列出。
3. 展开  ``Customer``  类。 
image::images/classes_window.png[]
4. 双击  ``name``  变量打开  ``customer.h``  头文件。


=== 使用 "Navigator"（导航器）窗口

"Navigator"（导航器）窗口提供了一个当前选定文件的紧凑图，并简化了文件不同部分之间的导航。如果未显示 "Navigator"（导航器）窗口，请选择 "Window"（窗口）> "Navigating"（导航）> "Navigator"（导航器）以将其打开。

1. 在编辑器窗口中单击  ``quote.cc``  文件中的任意位置。
2. 文件的紧凑视图就会在 "Navigator"（导航器）窗口中显示出来。
image::images/navigator_window.png[]
3. 要导航至文件的一个元素，可以在 "Navigator"（导航器）窗口中双击该元素，编辑器窗口中的光标就会移动到这个元素处。
4. 在 "Navigator"（导航器）中单击鼠标右键以选择其他元素排序方式、项目分组方式或过滤方式。

要了解 "Navigator"（导航器）中的各个图标所表示的内容，请选择 "Help"（帮助）> "Help Contents"（帮助内容）以打开 IDE 联机帮助，然后在帮助窗口中搜索“导航器图标”。


=== 查找类、方法和字段的使用实例

也可以使用 "Usages"（使用实例）窗口显示在项目源代码中使用一个类（结构）、函数、变量、宏或文件的所有地方。

1. 在  ``customer.cc``  文件中，右键单击第 42 行上的  ``Customer``  类，选择 "Find Usages"（查找使用实例）。
2. 在 "Find Usages"（查找使用实例）对话框中，单击 "Find"（查找）。
3. 此时 "Usages"（使用实例）窗口会打开并显示项目源文件中的  ``Customer``  类。
image::images/usages_window.png[]
4. 单击左旁注中的箭头按钮以逐一浏览各个实例并将其显示在编辑器中，或者在逻辑和物理视图之间更改。您也可以使用左旁注中的第二列按钮对信息进行过滤。


=== 使用调用图形

"Call Graph"（调用图形）窗口使用两个视图显示了项目中各函数之间的调用关系。树视图显示了从选定函数调用的函数或调用选定函数的函数。图形视图使用箭头显示了被调用函数和调用函数之间的调用关系。

1. 在  ``quote.cc``  文件中，右键单击  ``main``  函数，并选择 "Show Call Graph"（显示调用图形）。
2. 此时打开 "Call Graph"（调用图形）窗口，其中显示了从  ``main``  函数调用的所有函数的树视图和图形视图。
image::images/call_graph1.png[]

如果此处未显示所有函数，请单击 "Call Graph"（调用图形）窗口左侧的第三个按钮，以显示“从该函数调用的函数”。

3. 展开  ``endl``  节点以显示该函数所调用的函数。请注意，图形也会更新以显示由  ``endl``  调用的函数。
4. 单击窗口左侧的第二个按钮 "Bring Into Focus"（聚焦）以将焦点放在  ``endl``  函数上，然后单击第四个按钮 "Who Calls this Function"（此函数的调用者）以查看调用  ``endl``  函数的所有函数。
image::images/call_graph2.png[]
5. 展开树中的某些节点以查看更多函数。
image::images/call_graph3.png[]


=== 使用超链接

通过使用超链接导航，可以从调用类、方法、变量或常量跳转至声明，从声明跳转至定义。此外，也可以通过超链接从所覆盖的方法跳转至对其覆盖的方法，反之亦然。

1. 在  ``Quote_1``  项目的  ``cpu.cc``  文件中，按住 Ctrl 键的同时将鼠标悬停在第 37 行上。此时会突出显示  ``ComputeSupportMetric``  函数，并且还会显示一个包含该函数相关信息的标注。
image::images/hyperlinks1.png[]
2. 单击超链接，编辑器会跳转至函数定义。
image::images/hyperlinks2.png[]
3. 在按住 Ctrl 键的同时，将鼠标悬停在其定义上，然后单击超链接。编辑器会跳转至  ``cpu.h``  头文件中的函数声明。
image::images/hyperlinks3.png[]
4. 单击编辑器工具栏中的左箭头（从左侧算起的第二个按钮），编辑器会跳回  ``cpu.cc``  中的定义。
5. 将鼠标光标悬停在左旁注中的绿色圆圈上，此时会显示标注，指示此方法覆盖了其他方法。
image::images/overide_annotation.png[]
6. 单击绿色圆圈以转至覆盖的方法，此时会跳转至  ``module.h``  头文件，该文件的旁注中显示了指示方法已覆盖的灰色圆圈。
7. 单击灰色圆圈，编辑器会显示覆盖此方法的方法列表。
image::images/overridden_by_list.png[]
8. 单击  ``Cpu::ComputeSupportMetric``  项，此时会跳转回  ``cpu.h``  头文件中的方法声明。


=== 使用包含分层结构

"Include Hierarchy"（包含分层结构）窗口可用于检查直接或间接地包含在源文件中的所有头文件和源文件，或者直接或间接地包含头文件的所有源文件和头文件。

1. 在  ``Quote_1``  项目中，打开源代码编辑器中的  ``module.cc``  文件。
2. 右单击文件中的  ``#include "module.h"``  行，选择 "Navigate"（导航）> "View Includes Hierarchy"（查看包含分层结构）。
3. 默认情况下，"Hierarchy"（分层结构）窗口仅显示直接包含该头文件中的文件的普通列表。单击窗口底部最右边的按钮，把显示转化为树视图。单击右侧第二个按钮，将显示转换为包含或被包含的所有文件。展开树视图的节点，查看包含头文件的所有源文件。
image::images/includes_hierarchy.png[]


=== 使用类型分层结构

"Type Hierarchy"（类型分层结构）窗口可用来查看一个类的所有子类型或超类型。

1. 在  ``Quote_1``  项目中，打开  ``module.h``  文件。
2. 右键单击  ``Module``  类声明，选择 "Navigate"（导航）> "View Type Hierarchy"（查看类型分层结构）。
3. "Hierarchy"（分层结构）窗口显示 Module 类的所有子类型。
image::images/type_hierarchy.png[]


=== [[后续步骤]] 

请参见link:debugging.html[+调试 C/C++ 项目+]，该教程介绍了如何使用 NetBeans IDE 中的一些功能来调试 C 或 C++ 项目。

link:mailto:users@cnd.netbeans.org?subject=Feedback:%20Editing%20and%20Navigating%20C/C++%20Source%20Files%20-%20NetBeans%20IDE%207.3%20Tutorial[+发送有关此教程的反馈意见+]
