---
sort: 1
---

# C++开发简介

在我们编写和执行我们的第一个 C++ 程序之前，我们需要更详细地了解 C++ 程序是如何开发的。这是一个概述简单方法的图形：

![20220401221353-2022-04-01-22-13-54](https://cdn.jsdelivr.net/gh/ironartisan/picRepo/20220401221353-2022-04-01-22-13-54.png)

## 第 1 步：定义您要解决的问题

这是“什么”步骤，您可以在其中确定要解决的问题。想出你想要编程的最初想法可能是最简单的一步，也可能是最难的一步。但从概念上讲，它是最简单的。您所需要的只是一个可以明确定义的想法，然后您就可以进行下一步了。

这里有一些例子：

“我想编写一个程序，允许我输入许多数字，然后计算平均值。”
“我想编写一个程序来生成二维迷宫并让用户在其中导航。如果他们到达终点，用户就赢了。”
“我想编写一个程序，读取股票价格文件并预测股票是上涨还是下跌。”

## 第 2 步：确定您将如何解决问题

这是“如何”步骤，在此您确定将如何解决您在步骤 1 中提出的问题。这也是软件开发中最被忽视的步骤。问题的症结在于解决问题的方法有很多——然而，其中一些解决方案是好的，而一些是坏的。程序员经常会得到一个想法，坐下来，立即开始编写解决方案。这通常会产生一个属于不良类别的解决方案。

通常，好的解决方案具有以下特征：

它们很简单（不过分复杂或混乱）。
它们有据可查（尤其是围绕所做的任何假设或限制）。
它们是模块化构建的，因此以后可以重复使用或更改部分，而不会影响程序的其他部分。
它们很健壮，可以在发生意外情况时恢复或提供有用的错误消息。
当您坐下来立即开始编码时，您通常会想“我想做<某事>”，因此您实施的解决方案可以让您以最快的速度到达那里。这可能导致程序脆弱、以后难以更改或扩展，或者有很多错误（技术缺陷）。

研究表明，程序员实际上只有 20% 的时间用于编写初始程序。其余 80% 用于维护，其中可能包括调试（消除错误）、应对环境变化的更新（例如，在新的操作系统版本上运行）、增强（改进可用性或功能的小改动），或内部改进（以提高可靠性或可维护性）。

因此，值得您花一些额外的时间预先（在开始编码之前）考虑解决问题的最佳方法，您所做的假设以及您可能如何规划未来，以拯救自己很多时间和麻烦。

我们将在以后的课程中更多地讨论如何有效地设计问题的解决方案。

## 第三步：编写程序
为了编写程序，我们需要两件事：首先，我们需要编程语言的知识——这就是这些教程的目的！其次，我们需要一个文本编辑器来编写和保存我们编写的程序。我们使用 C++ 指令编写的程序称为源代码（通常简称为代码）。可以使用您想要的任何文本编辑器编写程序，甚至像 Window 的记事本或 Unix 的 vi 或 pico 一样简单。但是，我们强烈建议您使用专为编程而设计的编辑器（称为代码编辑器）。如果您还没有，请不要担心。我们将很快介绍如何安装代码编辑器。
为编码而设计的典型编辑器具有一些使编程更容易的功能，包括：

1. 行号。当编译器给我们一个错误时，行号很有用，因为典型的编译器错误会指出：一些错误代码/消息，第 64 行。如果没有显示行号的编辑器，查找第 64 行可能会很麻烦。
2. 语法高亮和着色。语法高亮和着色会改变程序各个部分的颜色，以便更容易识别程序的不同组件。下面是一个带有行号和语法高亮的 C++ 程序示例：

```
#include <iostream>

int main()
{
    std::cout << "Colored text!";
    return 0;
}
```
我们在本教程中展示的示例将始终同时具有行号和语法突出显示，以使它们更易于理解。

一种明确的字体。非编程字体通常很难区分数字 0 和字母 O，或者数字 1、字母 l（小写 L）和字母 I（大写 i）。一种好的编程字体将确保这些符号在视觉上有所区别，以确保不会意外使用一个来代替另一个。默认情况下，所有代码编辑器都应启用此功能，但标准文本编辑器可能不会。
您编写的程序通常会被命名为something.cpp，其中某些内容会替换为您为程序选择的名称（例如计算器、hi-lo 等）。.cpp扩展名告诉编译器（和您）这是一个包含 C++ 指令的 C++ 源代码文件。请注意，有些人使用扩展名 .cc 而不是 .cpp，但我们建议您使用 .cpp。

## 第 4 步：编译源代码

为了编译 C++ 程序，我们使用 C++ 编译器。C++ 编译器按顺序遍历程序中的每个源代码 (.cpp) 文件并执行两项重要任务：

首先，它会检查您的代码以确保它遵循 C++ 语言的规则。如果没有，编译器会给你一个错误（和相应的行号）来帮助确定需要修复的地方。编译过程也将中止，直到错误得到修复。

其次，它将您的 C++ 源代码翻译成称为目标文件的机器语言文件。对象文件通常命名为name.o或name.obj，其中name与生成它的 .cpp 文件的名称相同。

如果您的程序有 3 个 .cpp 文件，编译器将生成 3 个目标文件：

![20220401224241-2022-04-01-22-42-41](https://cdn.jsdelivr.net/gh/ironartisan/picRepo/20220401224241-2022-04-01-22-42-41.png)

## 第 5 步：链接目标文件和库

在编译器创建一个或多个目标文件之后，另一个名为链接器的程序就会启动。链接器的工作包括三个方面：

首先，获取编译器生成的所有目标文件，并将它们组合成一个可执行程序。

![20220401224252-2022-04-01-22-42-53](https://cdn.jsdelivr.net/gh/ironartisan/picRepo/20220401224252-2022-04-01-22-42-53.png)

其次，除了能够链接目标文件之外，链接器还能够链接库文件。库文件是已“打包”以在其他程序中重用的预编译代码的集合。

C++ 核心语言实际上相当小而简洁（您将在这些教程中学到很多）。但是，C++ 还附带了一个名为C++ 标准库（通常缩写为标准库）的扩展库，它提供了可以在程序中使用的附加功能。C++ 标准库中最常用的部分之一是iostream 库，其中包含在监视器上打印文本和从用户获取键盘输入的功能。几乎每个编写的 C++ 程序都以某种形式使用标准库，因此标准库链接到您的程序中是很常见的。大多数链接器会在您使用标准库的任何部分后立即自动链接到标准库中，因此这通常不是您需要担心的事情。

您还可以选择链接其他库。例如，如果您要编写一个播放声音的程序，您可能不想编写自己的代码来从磁盘读取声音文件，检查以确保它们有效，或者弄清楚如何路由声音数据通过扬声器播放到操作系统或硬件——那将是很多工作！相反，您可能会下载一个已经知道如何做这些事情的库，并使用它。我们将在附录中讨论如何在库中链接（并创建您自己的！）。

第三，链接器确保正确解析所有跨文件依赖项。例如，如果您在一个 .cpp 文件中定义某些内容，然后在另一个 .cpp 文件中使用它，则链接器会将两者连接在一起。如果链接器无法使用其定义连接对某事物的引用，您将收到链接器错误，并且链接过程将中止。

一旦链接器完成链接所有目标文件和库（假设一切顺利），您将拥有一个可执行文件，然后您可以运行它！

## 第 6 步和第 7 步：测试和调试

这是有趣的部分（希望如此）！您可以运行您的可执行文件并查看它是否产生您期望的输出！

如果您的程序运行但不能正常工作，那么是时候进行一些调试以找出问题所在了。我们将很快讨论如何测试您的程序以及如何更详细地调试它们。