0.7 — 编译你的第一个程序

在编写我们的第一个程序之前,我们需要学习如何在集成开发环境 (IDE) 中创建新程序。在本课程中,我们将介绍如何做到这一点,你还将编译并执行你的第一个程序!

项目

要在 IDE 中编写 C++ 程序,我们通常从创建新项目开始(我们稍后会向你展示如何操作)。项目是一个容器,包含所有源代码文件、图像、数据文件等,这些文件是生成可执行文件(或库、网站等)所需的,你可以运行或使用这些文件。项目还保存各种 IDE、编译器和链接器设置,并记住你上次离开的位置,这样当你以后重新打开项目时,IDE 的状态可以恢复到你上次离开的位置。当你选择编译程序时,项目中所有 .cpp 文件都将被编译和链接。

每个项目对应一个程序。当你准备创建第二个程序时,你需要创建一个新项目,或者覆盖现有项目中的代码(如果你不想保留它)。项目文件通常是 IDE 特定的,因此为某个 IDE 创建的项目需要在不同的 IDE 中重新创建。

最佳实践

为每个新编写的程序创建一个新项目。

控制台项目

当你创建新项目时,通常会询问你想要创建哪种类型的项目。我们将在本教程中创建的所有项目都将是控制台项目。控制台项目意味着我们将创建可以在 Windows、Linux 或 Mac 控制台中运行的程序。

这是 Windows 控制台的屏幕截图

Windows console

默认情况下,控制台应用程序没有图形用户界面 (GUI),它们将文本打印到控制台,从键盘读取输入,并编译成独立的执行文件。这非常适合学习 C++,因为它将复杂性降到最低,并确保在各种系统上都能正常工作。

如果你以前从未使用过控制台,或者不知道如何访问它,请不要担心。我们将通过 IDE 编译和启动程序(必要时会调用控制台)。

工作区/解决方案

当你为程序创建新项目时,许多 IDE 会自动将你的项目添加到“工作区”或“解决方案”(术语因 IDE 而异)。工作区或解决方案是一个可以包含一个或多个相关项目的容器。例如,如果你正在编写一个游戏,并且想要为单人游戏和多人游戏提供单独的可执行文件,则需要创建两个项目。这两个项目完全独立是没有意义的——毕竟,它们是同一个游戏的一部分。最有可能的是,每个项目都会在单个工作区/解决方案中配置为单独的项目。

尽管你可以在单个解决方案中添加多个项目,但我们通常建议为每个程序创建一个新的工作区或解决方案,尤其是在学习期间。它更简单,而且出错的可能性更小。

编写你的第一个程序

传统上,程序员用新语言编写的第一个程序是臭名昭著的 “Hello World”程序,我们不会剥夺你的这种体验!你以后会感谢我们的。也许吧。

在 Visual Studio 2019(或更高版本)中创建项目

当你运行 Visual Studio 2019(或更高版本)时,你应该会看到一个如下所示的对话框

Visual Studio 2019 Get Started dialog

选择创建新项目

然后你会看到一个如下所示的对话框

Visual Studio 2019 Create New Project dialog

如果你已经打开了以前的项目,可以通过文件菜单 > 新建 > 项目访问此对话框。

选择Windows 桌面向导,然后单击下一步。如果你没有看到此选项,则可能是你安装 Visual Studio 时忘记选择安装使用 C++ 的桌面开发工作负载。在这种情况下,请返回到课程 0.6 -- 安装集成开发环境 (IDE) 并按照指示重新安装 Visual Studio(注意:与其进行完整重新安装,不如运行 Visual Studio 安装程序并修改现有安装以添加 C++ 工作负载)。

接下来,你会看到一个如下所示的对话框

Visual Studio 2019 Configure New Project dialog

将现有项目名称替换为HelloWorld

建议你同时选中将解决方案和项目放在同一目录中,这会减少每个项目创建的子目录数量。

单击创建以继续。

最后,你会看到最后一个对话框

Visual Studio 2019 Project options dialog

确保应用程序类型设置为控制台应用程序 (.exe),并且预编译头选项未选中。然后单击确定

你现在已经创建了一个项目!跳到下面的 Visual Studio 解决方案资源管理器 部分继续。

问:什么是预编译头文件,为什么要关闭它们?

在大型项目(包含许多代码文件的项目)中,预编译头文件可以通过避免大型项目中容易出现的冗余编译来提高编译速度。

但是,预编译头文件需要额外的工作才能使用,对于小型项目(例如你将在我们的教程中创建的项目)来说,对编译时间几乎没有影响。

因此,我们建议最初关闭预编译头文件,只有当你发现编译时间变长时才启用它们。

在 Visual Studio 2017 或更早版本中创建项目

要在 Visual Studio 2017 或更早版本中创建新项目,请转到文件菜单 > 新建 > 项目。一个对话框将弹出,看起来像这样

Visual Studio 2017 New Project dialog

首先,确保左侧列出了Visual C++。如果你没有看到Visual C++,那么你可能在安装 Visual Studio 时忘记选择安装使用 C++ 的桌面开发工作负载。在这种情况下,请返回课程 0.6 -- 安装集成开发环境 (IDE) 并按照指示重新安装 Visual Studio(注意:与其进行完整重新安装,不如运行 Visual Studio 安装程序并修改现有安装以添加 C++ 工作负载)。

如果你使用的是 Visual Studio 2017 v15.3 或更高版本,在Visual C++下方,选择Windows 桌面,然后在主窗口中选择Windows 桌面向导

如果你没有看到Windows 桌面选项,你可能正在使用较旧的 Visual Studio 版本。没关系。相反,选择Win32,然后在主窗口中选择Win32 控制台应用程序

在下方,在名称字段中,输入程序名称(将现有名称替换为HelloWorld)。在位置字段中,你可以选择项目的不同放置位置。目前使用默认位置即可。

单击确定。如果你使用的是旧版本的 Visual Studio,Win32 应用程序向导将启动。按下一步

此时,你应该会看到一个向导对话框,如下所示(旧版本的 Visual Studio 使用不同的样式,但具有大多数相同的选项)

Visual Studio 2017 Desktop wizard

确保取消选中预编译头

然后单击确定完成。现在你的项目已创建!

Visual Studio 解决方案资源管理器

在窗口的左侧或右侧,你应该会看到一个名为解决方案资源管理器的窗口。在这个窗口中,Visual Studio 已经为你创建了一个解决方案(解决方案“HelloWorld”)。在其中,用粗体显示名称的是你的新项目(HelloWorld)。在项目内部,Visual Studio 已经为你创建了许多文件,包括HelloWorld.cpp(在源文件树项目下方)。你可能还会看到其他一些 .cpp 或 .h 文件,暂时可以忽略它们。

Visual Studio 2019 initial windows

在文本编辑器中,你会看到 Visual Studio 已经打开了HelloWorld.cpp并为你创建了一些代码。选择并删除所有代码,然后将以下内容输入/复制到你的 IDE 中

#include <iostream>

int main()
{
	std::cout << "Hello, world!";
	return 0;
}

要编译你的程序,请按 F7(如果这不起作用,请尝试 Ctrl-Shift-B)或转到 生成菜单 > 生成解决方案。如果一切顺利,你应该会在输出窗口中看到以下内容

1>------ Build started: Project: HelloWorld, Configuration: Debug Win32 ------
1>HelloWorld.cpp
1>HelloWorld.vcxproj -> c:\users\alex\documents\visual studio 2017\Projects\HelloWorld\Debug\HelloWorld.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

这意味着你的编译成功了!

问:我收到错误 C1010(“致命错误 C1010:查找预编译头时文件意外结束。你是否忘记在源代码中添加‘#include "stdafx.h"’?”)。现在怎么办?

你创建项目时忘记关闭预编译头文件了。根据 上述说明 重新创建项目,并确保禁用预编译头文件。

要运行已编译的程序,请按 Ctrl-F5,或转到 调试菜单 并选择 开始不调试。你将看到以下内容

Program run

这就是你的程序的结果!恭喜,你已经编译并运行了你的第一个程序!

相关内容

当你直接从 Visual Studio 运行程序时,你可能会看到一行额外的输出,如下所示

C:\Users\Alex\source\repos\Project6\Debug\Project6.exe (process 21896) exited with code 0.

这是正常的。Visual Studio 提供了关于你的程序是正常退出还是异常退出的一些额外信息。我们将在课程 2.2 -- 函数返回值(值返回函数) 中进一步讨论这一点。

在 Code::Blocks 中创建项目

要创建新项目,请转到文件菜单 > 新建 > 项目。一个对话框将弹出,如下所示

Code::Blocks Project Dialog

选择控制台应用程序,然后按前往(或创建)按钮。

如果你看到控制台应用程序向导对话框,请按下一步,确保选中 C++,然后再次按下一步

现在将要求你命名你的项目。将项目命名为HelloWorld。你可以随意保存它。在 Windows 上,我们建议你将其保存在 C 盘的子目录中,例如C:\CBProjects

Code::Blocks Save Project Dialog

你可能会看到另一个对话框,询问你想要启用哪些配置。默认值应该没问题,所以选择完成

现在你的新项目已经创建。

在屏幕左侧,你应该会看到一个管理窗口,其中选中了项目选项卡。在该窗口中,你会看到一个工作区文件夹,其中包含你的HelloWorld项目

Code::Blocks Workspace

HelloWorld项目中,展开源文件文件夹,然后双击“main.cpp”。你会看到一个 Hello World 程序已经为你编写好了!

用以下内容替换它

#include <iostream>

int main()
{
	std::cout << "Hello, world!";
	return 0;
}

要构建你的项目,请按Ctrl-F9,或者转到构建菜单 > 构建。如果一切顺利,你应该会在构建日志窗口中看到以下内容

-------------- Build: Debug in HelloWorld (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -fexceptions -g -std=c++14  -c C:\CBProjects\HelloWorld\main.cpp -o obj\Debug\main.o
mingw32-g++.exe  -o bin\Debug\HelloWorld.exe obj\Debug\main.o   
Output file is bin\Debug\HelloWorld.exe with size 1.51 MB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

这意味着你的编译成功了!

要运行已编译的程序,请按Ctrl-F10,或者转到构建菜单 > 运行。你将看到类似于以下内容

Program run

这就是你的程序的结果!

对于 Linux 用户

Linux 用户可能需要安装其他软件包,Code::Blocks 才能编译。有关详细信息,请参阅课程 0.6 -- 安装集成开发环境 (IDE) 中的 Code::Blocks 安装说明。

在 VS Code 中创建项目

要启动新项目,请转到视图 > 资源管理器菜单(或按Ctrl-Shift-E)。这将打开资源管理器窗格。如果你以前没有打开过项目,你应该会在资源管理器窗格中看到一个打开文件夹按钮——按下它。如果已经有一个打开的项目,并且你想启动一个新项目,请从顶部导航中选择文件 > 打开文件夹

在打开的对话框中,创建一个名为HelloWorld的新文件夹,然后选择此文件夹。此文件夹将成为你的项目文件夹。

接下来,我们需要创建包含源代码的文件。从顶部导航中选择文件 > 新文件,或单击资源管理器窗格中HELLOWORLD右侧的新文件图标

将文件命名为main.cpp并向其中添加以下内容

#include <iostream>

int main()
{
	std::cout << "Hello, world!";
	return 0;
}

要编译main.cpp并运行程序,请确保main.cpp在主窗格中打开,然后从顶部导航中选择运行 > 不调试运行,或单击main.cpp选项卡右侧播放图标右侧的v并选择运行 C/C++ 文件

接下来,选择g++ 构建和调试活动文件选项(macOS 用户应选择clang++而不是g++)。将窗口底部的选项卡从调试控制台切换到终端

如果终端包含文本“Hello, world!”,那么恭喜你,你刚刚运行了你的第一个 C++ 程序!

如果你在命令行中使用 g++

在这种情况下,你不需要创建项目。只需将以下内容粘贴到名为 HelloWorld.cpp 的文本文件中并保存你的文件

#include <iostream>

int main()
{
	std::cout << "Hello, world!";
	return 0;
}

在命令行中,输入

g++ -o HelloWorld HelloWorld.cpp

这将编译并链接 HelloWorld.cpp。要运行它,输入

HelloWorld(或可能是./HelloWorld),你将看到程序输出。

如果你使用其他 IDE 或基于网络的编译器

你将不得不自己找出如何执行以下操作

  1. 创建控制台项目(仅限 IDE)
  2. 向项目添加 .cpp 文件(仅限 IDE,如果未自动为你创建)
  3. 将以下代码粘贴到文件中
#include <iostream>

int main()
{
	std::cout << "Hello, world!";
	return 0;
}
  1. 编译项目
  2. 运行项目

如果编译失败

没关系,深呼吸。我们可能能解决它。:)

首先,查看编译器给出的错误消息。通常,它会包含一个行号,指示哪一行出现错误。检查该行及其周围的行,并确保没有拼写错误或打字错误。还要确保你的代码中没有包含行号(你的编辑器应该提供这些)。

其次,查看课程 0.8 -- 一些常见的 C++ 问题 中的问答,你的问题可能在那里得到了解答。

第三,阅读你正在编译的示例所在课程下方的评论——可能有人遇到了相同的问题并提供了解决方案。

最后,如果以上所有方法都失败了,尝试在你喜欢的搜索引擎上搜索你的错误消息。很可能其他人以前遇到过这个问题并找到了解决方法。

如果你的程序运行但控制台窗口闪烁并立即关闭

当控制台程序运行时,控制台窗口将打开,程序的任何输出都将写入控制台窗口。

当程序运行完毕后,大多数现代 IDE 会保持控制台打开(直到你按下某个键),这样你就可以在继续之前检查程序的结果。但是,一些较旧的 IDE 会在程序运行完毕后自动关闭控制台窗口。这通常不是你想要的。

如果你的 IDE 自动关闭控制台窗口,可以使用以下两个步骤来确保控制台在程序结束时暂停。

首先,添加或确保以下行位于程序的顶部附近

#include <iostream>
#include <limits>

其次,在 main() 函数的末尾(紧接在 return 语句之前)添加以下代码

std::cin.clear(); // reset any error flags
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore any characters in the input buffer until we find a newline
std::cin.get(); // get one more char from the user (waits for user to press enter)

这将使你的程序在继续之前等待用户按下回车键(你可能需要按两次回车),这将为你提供时间来检查程序的输出,然后你的 IDE 才会关闭控制台窗口。

其他解决方案,例如通常建议的system("pause")解决方案,可能只适用于某些操作系统,应避免使用。

如果控制台窗口根本没有打开,并且你的程序似乎没有运行,你的防病毒或反恶意软件也可能正在阻止程序的执行。如果是这种情况,请尝试暂时禁用你的扫描程序,看看问题是否解决,或者将项目目录从扫描中排除。

提示

如果你正在使用防病毒或反恶意软件,请考虑将你的项目目录从扫描中排除,因为编译和调试可能会导致误报。

IDE 中的编译、构建、重新构建、清理和运行/启动选项有什么区别?

在课程 0.5 -- 编译器、链接器和库简介 中,我们展示了要生成可运行的可执行文件,程序中的每个代码文件都会编译成一个对象文件,然后对象文件会链接成一个可执行文件。

当代码文件被编译时,你的 IDE 可能会将生成的对象文件缓存(保存)到磁盘上。缓存(发音类似于“cash”)是一种存储位置,用于存储频繁访问的数据,以便以后快速检索。这样,如果程序将来再次编译,任何未修改的代码文件都不需要重新编译——上次缓存的对象文件可以重复使用(而不是需要重新生成)。这可以显著加快编译时间(以牺牲少量磁盘空间为代价)。

考虑到这一点,以下是每个选项通常的作用

  • 构建编译项目或工作区/解决方案中所有已修改的代码文件,然后将对象文件链接成可执行文件。如果自上次构建以来没有代码文件被修改,此选项不执行任何操作。
  • 清理删除所有缓存的对象和可执行文件,以便下次构建项目时,所有文件都将重新编译并生成新的可执行文件。
  • 重新构建执行“清理”,然后执行“构建”。
  • 编译重新编译单个代码文件(无论是否已缓存)。此选项不调用链接器或生成可执行文件。
  • 运行/启动执行先前构建的可执行文件。某些 IDE(例如 Visual Studio)会在“运行”之前调用“构建”,以确保你正在运行最新版本的代码。否则(例如 Code::Blocks)将只执行先前的可执行文件。

尽管我们非正式地谈论“编译”我们的程序,但要实际编译我们的程序,我们通常会选择 IDE 中的“构建”(或“运行”)选项来完成。

总结

恭喜你,你已经完成了本教程中最困难的部分(安装 IDE 并编译你的第一个程序)!

如果你不理解 Hello World 程序中不同行的作用,请不要担心。我们将在下一章的开头详细检查并解释每一行。

guest
您的电子邮箱地址将不会被显示
发现错误?请在上方留言!
与勘误相关的评论在处理后将被删除,以帮助减少混乱。感谢您帮助使网站对每个人都更好!
来自 https://gravatar.com/ 的头像与您提供的电子邮箱地址相关联。
有回复时通知我:  
1.3K 评论
最新
最早 最多投票
内联反馈
查看所有评论