编译你的第一个程序

项目基础知识

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

项目概念

在IDE中编写C++程序时,我们通常首先创建一个新项目(我们稍后会向您展示如何操作)。项目是一个容器,它保存了所有需要的源代码文件、图像、数据文件等…以生成可执行文件(或库、网站等…),您可以运行或使用。项目还保存了各种IDE、编译器和链接器设置,并记住了您离开的位置,以便您稍后重新打开项目时,IDE的状态可以恢复到您离开的地方。当您选择编译程序时,项目中的所有.cpp文件将被编译并链接。 每个项目对应一个程序。当您准备创建第二个程序时,您将需要创建一个新项目,或者覆盖现有项目中的代码(如果您不想保留它)。项目文件通常是IDE特定的,因此为一个IDE创建的项目将需要在不同的IDE中重新创建。

最佳实践 为您编写的每个新程序创建一个新项目。

控制台项目

当您创建一个新项目时,通常会被询问您想要创建什么类型的项目。我们将在本教程中创建的所有项目都将是控制台项目。控制台项目意味着我们将创建可以从Windows、Linux或Mac控制台运行的程序。 这是Windows控制台的截图:

控制台项目

默认情况下,控制台应用程序没有图形用户界面(GUI),它们向控制台打印文本,从键盘读取输入,并被编译成独立的可执行文件。这对于学习C++来说非常完美,因为它将复杂性降到最低,并确保在各种系统上都能工作。 如果您以前从未使用过控制台,或者不知道如何访问它,请不要担心。我们将通过我们的IDE编译并启动我们的程序(这将在必要时调用控制台)。

工作区/解决方案

当您为您的程序创建一个新项目时,许多IDE会自动将您的项目添加到"工作区"或"解决方案"(这个术语因IDE而异)。工作区或解决方案是一个容器,可以包含一个或多个相关项目。例如,如果您正在编写一个游戏,并希望为单人游戏和多人游戏分别拥有一个单独的可执行文件,您需要创建两个项目。这两个项目不应该完全独立——毕竟,它们是同一个游戏的一部分。最有可能的是,每个项目都被配置为单个工作区/解决方案内的单独项目。 尽管您可以将多个项目添加到单个解决方案中,但我们通常建议为每个程序创建一个新的工作区或解决方案,特别是在学习时。这样更简单,出错的机会也更少。

编写你的第一个程序

传统上,程序员在新语言中编写的第一个程序是臭名昭著的hello world程序,我们不会剥夺您的这种体验!您以后会感谢我们的。也许。

在Visual Studio中创建项目

Visual Studio 2019及更新版本

当您运行Visual Studio 2019(或更新版本)时,您应该会看到一个这样的对话框:

Visual Studio 2019创建项目

选择创建一个新项目。 然后,您将看到一个这样的对话框:

Visual Studio 2019创建项目

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

选择Windows桌面向导并点击下一步。如果您没有看到这个,请确保您在安装Visual Studio时选择了安装桌面开发与C++工作负载。如果没有,请回到课程0.6 - 安装集成开发环境(IDE)并按照指示重新安装您的Visual Studio(注意:而不是进行全面重新安装,您可以运行Visual Studio安装程序并修改您现有的安装以添加C++工作负载)。 接下来,您将看到一个这样的对话框:

Visual Studio 2019创建项目 将现有的项目名称替换为HelloWorld。 建议您还勾选"将解决方案和项目放置在同一目录",因为这减少了每个项目创建的子目录数量。 点击创建以继续。 最后,您将看到一个最后的对话框:

Visual Studio 2019创建项目 确保应用程序类型设置为控制台应用程序(.exe),并且未选中预编译头文件选项。然后点击确定。 现在您已经创建了一个项目!跳转到下面的Visual Studio解决方案资源管理器部分以继续。

预编译头文件说明

问:什么是预编译头文件,我们为什么要关闭它们? 在大型项目(那些有许多代码文件的项目)中,预编译头文件可以通过避免在大型项目中经常发生的一些冗余编译来提高编译速度。 然而,预编译头文件需要额外的工作来使用,对于小型项目(例如您将在我们的教程中创建的项目)在编译时间上几乎没有或没有差异。 因此,我们建议最初关闭预编译头文件,只有在您发现编译时间受到影响时才启用它们。

Visual Studio 2017或更早版本

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

Visual Studio 2017创建项目

首先,请确保左侧列出了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创建项目

确保您取消选中预编译头文件。 然后点击确定或完成。现在您的项目已创建!

Visual Studio解决方案资源管理器

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

Visual Studio解决方案资源管理器

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

#include <iostream>

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

编译和运行程序

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

1>------ 构建开始:项目:HelloWorld,配置:Debug Win32 ------
1>HelloWorld.cpp
1>HelloWorld.vcxproj -> c:\users\alex\documents\visual studio 2017\Projects\HelloWorld\Debug\HelloWorld.exe
========== 构建:1成功,0失败,0已更新,0跳过 ==========

这意味着您的编译成功!

编译错误处理

问:我得到了错误C1010(“严重错误C1010:在寻找预编译头文件时意外到达文件末尾。您是否忘记在源代码中添加’#include “stdafx.h”’?")。现在怎么办? 您在创建项目时忘记关闭预编译头文件。重新创建您的项目(按照上述说明),并确保禁用预编译头文件。

要运行编译后的程序,请按Ctrl-F5,或转到调试菜单并选择"不调试启动”。您将看到以下内容:

Visual Studio编译错误处理 这是您的程序的结果!恭喜,您已经编译并运行了您的第一个程序!

额外输出说明

当您直接从Visual Studio运行程序时,您可能会看到额外的一行输出,看起来像这样:

C:\Users\Alex\source\repos\Project6\Debug\Project6.exe(进程21896)以代码0退出。

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

在Code::Blocks中创建项目

要创建一个新项目,请转到文件菜单>新建>项目。一个对话框将弹出,看起来像这样:

Code::Blocks创建项目

选择控制台应用程序并按Go(或创建)按钮。 如果您看到一个控制台应用程序向导对话框,请按Next,确保选中C++并再次按Next。 现在,您将被要求为您的项目命名。将项目命名为HelloWorld。您可以在任何地方保存它。在Windows上,我们建议您将其保存在C驱动器的子目录中,例如C:\CBProjects。

Code::Blocks创建项目 您可能会看到另一个对话框,询问您想要启用哪些配置。这里默认设置就可以了,所以选择Finish。 现在您的新项目已创建。 在屏幕的左侧,您应该看到一个管理窗口,选择项目标签。在该窗口中,您将看到一个工作区文件夹,其中包含您的HelloWorld项目:

Code::Blocks创建项目

在HelloWorld项目中,展开源文件夹,并双击"main.cpp"。您会看到已经为您编写了一个hello world程序! 将其替换为以下内容:

#include <iostream>

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

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

-------------- 构建:HelloWorld中的Debug(编译器:GNU GCC编译器)---------------
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   
输出文件为bin\Debug\HelloWorld.exe,大小为1.51 MB
进程以状态0终止(0分钟,0秒)
0错误,0警告(0分钟,0秒)

这意味着您的编译成功! 要运行编译后的程序,请按Ctrl-F10,或转到构建菜单>运行。您将看到类似以下内容:

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++)。将底部窗口的标签从DEBUG CONSOLE切换到TERMINAL。 如果终端包含文本"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或基于Web的编译器 您将不得不自己弄清楚如何做到以下几点:

创建一个控制台项目(仅限IDE)

将.cpp文件添加到项目中(仅限IDE,如果未为您自动创建)

将以下代码粘贴到文件中:

#include <iostream>

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

编译项目

运行项目

如果编译失败 没关系,深呼吸。我们可能可以修复它。 首先,查看编译器给您的错误消息。大多数情况下,它将包含一个行号,指示哪行有错误。检查那一行及其周围的行,并确保没有拼写错误或错别字。还要确保您的代码中不包含行号(您的编辑器应该提供这些)。 其次,查看课程0.8中的问答 - 一些常见的C++问题,因为您的问题可能在那里有所涵盖。 第三,阅读包含您正在编译的示例的课程下方的评论 - 有人可能遇到了相同的问题并提供了解决方案。 最后,如果上述所有方法都失败,请尝试在您最喜欢的搜索引擎上搜索您的错误消息。很可能其他人以前遇到过这个问题,并找出了如何解决它。 如果您的程序运行但控制台窗口立即闪烁并关闭 当运行控制台程序时,控制台窗口将打开,程序的任何输出都将写入控制台窗口。 当程序运行完毕后,大多数现代IDE会保持控制台打开(直到您按一个键),这样您可以在继续之前检查程序的结果。然而,一些较旧的IDE会在程序运行完毕后自动关闭控制台窗口。这通常不是您想要的。 如果您的IDE自动关闭控制台窗口,以下两个步骤可以用来确保程序结束时控制台暂停。 首先,在程序的顶部添加或确保以下行:

#include <iostream>
#include <limits>

其次,在main()函数的末尾添加以下代码(在返回语句之前):

std::cin.clear(); // 重置任何错误标志
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 忽略输入缓冲区中的任何字符,直到我们找到一个新行
std::cin.get(); // 从用户那里获取一个更多的字符(等待用户按回车)

这将导致您的程序在继续之前等待用户按回车(您可能需要按回车两次),这将给您时间在IDE关闭控制台窗口之前检查程序的输出。 其他解决方案,例如通常建议的system(“pause”)解决方案可能只在某些操作系统上有效,应该避免。 如果控制台窗口根本没有打开,并且您的程序似乎没有运行,您的防病毒或反恶意软件也可能阻止程序执行。如果是这种情况,请尝试暂时禁用您的扫描器,看看问题是否解决,或将项目目录从您的扫描中排除。

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

我的IDE中的编译、构建、重建、清理和运行/开始选项之间有什么区别? 在课程0.5 - 编译器、链接器和库简介中,我们展示了为了生成可以运行的可执行文件,程序中的每个代码文件都被编译成对象文件,然后对象文件被链接成可执行文件。 当一个代码文件被编译时,您的IDE可能会缓存(保存)结果对象文件到磁盘上。缓存(发音像"现金")是一个存储位置,频繁访问的数据存储在这里,以便以后快速检索。这样,如果程序将来再次编译,任何自上次构建以来没有被修改的代码文件就不需要重新编译——可以重用上次缓存的对象文件(而不是必须重新生成)。这可以显著加快编译时间(以牺牲一点磁盘空间为代价)。 考虑到这一点,以下是每个选项通常的作用:

构建编译项目或工作区/解决方案中所有已修改的代码文件,然后将对象文件链接成可执行文件。如果自上次构建以来没有代码文件被修改,此选项不执行任何操作。

清理删除所有缓存的对象和可执行文件,以便下次构建项目时,所有文件将被重新编译并生成新的可执行文件。

重建执行"清理",然后执行"构建"。

编译重新编译单个代码文件(无论是否之前已缓存)。此选项不调用链接器或生成可执行文件。

运行/开始执行先前构建的可执行文件。一些IDE(例如Visual Studio)在执行"运行"之前会调用"构建",以确保您正在运行代码的最新版本。否则(例如Code::Blocks)将仅执行先前的可执行文件。

尽管我们非正式地谈论"编译"我们的程序,但实际上编译我们的程序时,我们通常会选择IDE中的"构建"(或"运行")选项来执行此操作。 结论 恭喜您完成了本教程中最困难的部分(安装IDE并编译您的第一个程序)! 如果您不理解Hello World程序中不同行的作用,请不要担心。我们将在下一章的开始详细检查并解释每一行。

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"