赞
踩
前言:这一节是对编程整个流程的概述。乍一看可能有点‘虚’,没有实际知识点,但是作为一个有使用其他语言编程经验的小码农我能感觉到这些都是作者的肺腑之言。这些高度概括的小窍门可能新手不能马上100%领会,但如果能认真听取这些意见以后一定会受益匪浅的。阅读愉快。
在编写/执行第一段C++程序之前,我们需要了解编写程序的主要流程。
下图是简化的流程图:
这一步决定了你的程序要‘做什么’,既对你的程序具体要完成什么任务有个初步规划。这一步也许很容易,也可能很难。但是概念来说,是最简单的。只要你找到了一个既定好的问题,就可以考虑下一步啦。
这个问题可以是:
• 我想要编写一个程序,能够记录我输入的数字并计算他们的平均值。
• 我想要编写一个程序,能够生成一个2D的迷宫,而且能与玩家交互。
• 我想要编写一个程序,能够读取某只股票的以往的价格并预测它会上涨还是下跌。
这一步决定了你的程序要‘怎样做’,去解决第一步中设立的问题。在许多软件开发的过程中,这一步常被忽略。忽略这一步的核心问题在于同一个问题往往有许多解法,但这些解法有好有坏。人们常常脑子里产生第一个解法后,就匆匆坐下开始编程,而这个最先被想到的解法很可能不是最优解。
通常情况下,一个好解法具有如下特征:
• 直接
• 经得起推敲(尤其当其基于特定假设时)
• 模块化,使得其组成部分可被再利用或者替换
• 鲁棒性强,可恢复或者能在未预见的情况发生时给出有用的错误提示信息
当你拿到问题的第一瞬间就开始码代码,你通常想的是“我想要做 某事”。这种应激反应情况编写的程序,是最快的解法,但很可能鲁棒性低,难以更改或延展,甚至会有许多bugs。
有研究表明程序员的工作时间中只有20%被用来编写起始程序,剩下80%都是在调试/解决bug,或者维护程序 (我觉得还有起码20%用于安装更新各种函数库或软件TAT)。这数据表明,在一开始时稍微多花一点时间仔细思考如何解决一个问题可能往往效率更高。明确你预设了哪些条件,未来如何计划,最终会为你节约大量时间。
我们会在余下的课程仔细讲解如何设计问题的有效解法。
编写一个程序需要知道以下两点:1.我们需要了解一门编程语言(这个教程就是为了帮助你完成这点!)2.我们需要一个编辑器。你可以用任何你喜欢或习惯的编辑器,比如Windows 的Notepad, Unix的pico。但我们强烈建议你使用一个专为编程设计的编辑器。如果你现在还没有安装编辑器别担心,之后章节会讨论这部分内容。
一个专为编程设计的编辑器通常拥有如下优点:
你的C++程序文件名的后缀应是.cpp。这个扩展名告诉你的编辑器这个文件是个C++源代码。也有人使用.cc的后缀名,不过这里推荐.cpp。
另外注意许多复杂的C++程序中包含多个.cpp文件。尽管大部分你开始学习编程时编写的程序都只含有一个.cpp文件,但理论上这个数目是没有上限的。
为了编译一段程序,我们需要一个编译器。编译器有以下两个功能:
举个例子,大部分Linux或者MacOS系统的C++编译器叫g++。如果你使用g++来编译源代码,可能会在command line中输入以下指令:
g++ -c file1.cpp file2.cpp file3.cpp
这个指令会生成 file1.o, file2.o, 和 file3.o三个文件。“-c”的意思是只编译,即让g++只生成.o文件。
还有很多编译器可供不同系统使用,这里就不在一一举例。
针对一些复杂程序,开发环境可能会使用makefile。这个文件会告诉编译器应该编译哪些文件。Makefile是高级文件,有专门的书籍讲解介绍,这里也不再多言。
链接是将所有object文件关联在一起并将他们转化为单一可运行的执行文件。这一步由连接器(Linker)完成。
除了一个项目里的object文件,连接器还会关联C++标准库(或其他函数库,比如声卡或图像函数库)里的相关文件。C++本身其实并不复杂,但是它伴随有庞大的补充功能可供使用。而这些补充功能能在C++标准库里找到。比方说,你想要在屏幕上输出某内容,你的程序需要添加一项特殊指令,以告知你的编译器你想要使用C++标准库里面的I/O(input/output)条款。
当所有object文件都被连接器关联完毕,你会得到一个可执行文件。与上文类似,让我们用g++举例:
g++ -o prog file1.o file2.o file3.o
‘-o’ 告诉g++我们想要用file1.o, file2.o,和 file3.o生成一个名为 ‘prog’的可执行文件。
编译跟连接可以合并为一步
g++ -o prog file1.cpp file2.cpp file3.cpp
上面这行指令会先后执行编译跟连接,最后直接生成名为‘prog’的可执行文件。
好玩的终于来了(希望总要有的)!你现在可以运行你的可执行文件看看是不是输出了你所预期的结果。如果不是的话,就需要调试程序啦。后面的章节会详细讨论调试的。
注意第三,四,五,六步都要用软件。当然你也可以用不同的软件完成各个步骤,使用集成开发环境(IDE)软件包可以将所有步骤打包,一起完成。一个常见IDE也包含代码编辑器(标注行数,高亮文本),编译器, 连接器。即使是处理多文件程序时,IDE会自动选择编译或者链接需要的参数,最后生成一个可执行文件。还有集成式调试器可用于调试程序。更好的是,IDE还有许多别的辅助功能,比如说集成化的帮助功能,文本自动补全,层级式浏览,有时还包含版本调整系统。
说明: 这系列笔记是基于网上一个英文教程[LearnCPP][1]。