快速上手阅读 C++ 代码

在开始这个章节前,读者需要:

  • 了解信息在计算机中的存储形式
  • 有一定的数据结构基础
  • 了解文件、目录等概念
  • 有一定的命令行基础,理解 CLI 应用。

C/C++ 是很基础的编程语言。因为其编程过程较为贴近计算机运行的实质(相对其他编程语言抽象程度较低),一般执行效率很高,常被用来编写一些提供基础功能的程序。

要想读懂一般的 C/C++ 代码其实不难,我们只需要熟悉若干基本概念以及一些符号的语义即可。我们接下来主要介绍 C++ 的代码。

编译

C/C++ 是一种需要经过编译器编译(compile)、生成可执行文件才能执行的语言。C/C++ 的源代码是人类可读的、由文本字符组成的,而编译,就是将源代码变成 CPU 能理解并执行的指令的过程。作为普通用户,我们一般不需要了解编译器是如何分析理解源代码,并将其最终变成机器指令的过程。

需要了解,不同的 CPU 平台,由于指令集不尽相同(实现相同的效果所需的指令不同、指令的格式不同),因此针对一个平台生成的可执行的文件,如果不借助其他工具,在另一个平台上可能就是完全不能理解的文件;不同操作系统也是如此——每个系统有自己的可执行文件的格式,不同操作系统格式不同,则无法通用。

幸运的是,大多数情况下,像 C/C++ 这样的高级语言的源代码,只需要经过一些修改,或者甚至不需要修改,就可以通过相应平台上的编译器,生成针对具体平台的可执行文件。也就是说,我们编写的程序针对各个平台的翻译工作,都是在编译器来完成的了。这给我们的开发带来了很大的方便。

由于编译器只和文本文件打交道,所以编译器一般都是 CLI 应用,一般需要用户通过命令行来操作(关于命令行和 CLI 应用,读者可以阅读下一章节)。因此,理论上我们只需要一个文本文件编辑器和编译器,就能完成 C/C++ 程序的编写。不过为了方便开发,常用带有图形界面的 IDE(集成开发环境),通常只需要一些简单的配置,IDE 就能帮我们调用编译器、完成编译等操作。通常,IDE 也具有调试、协同开发等其他很多功能。恰当的使用工具能够大幅提升我们的效率。

链接

我们可以将一些常用的代码事先编译成机器指令,这样在需要的时候便可以省却编译的时间,直接使用即可。这些预先编译好的代码文件一般称作“(library)文件”。库也可以泛指所有事先写好、可以复用/供人调用的代码,并不一定是经过编译的。

根据我们编写程序的调用,寻找对应的代码的过程叫做链接(linking)。链接有动态(dynamic)链接和静态(static)链接之分。静态链接可以想象成直接把编译好的代码复制到编译出来的可执行文件中,而动态链接则是先标记好需要调用的代码在对应的库文件中的位置,在程序执行时才去加载对应的库。

用于动态链接的库文件称为动态链接库(文件),用于静态链接的称为静态链接库(文件)。

由于两种链接方式存在不同,有些代码的许可证可能会限制开发者可以使用的链接方式。

C/C++ 编译器会带有具备一些基础功能的库,称为“标准库”。C++ 编译器在生成可执行文件时,会默认链接到标准库。但是,如果要使用其他的第三方库,就要手动的告诉编译器需要链接哪些库,以及它们所在的位置。

C、C++ 的版本

C/C++ 语言有着不同的版本,每个版本可能会规定一些新的规范、提出一些新的功能。但是这些规范和功能的实现情况,需要看具体的编译器厂商的进度。

常见的编译器有 GNU GCC、Clang、MSVC 等等。

截至目前,最新的 C++ 标准为 C++20,之前的标准还有 C++11、C++14、C++17 等。

C、C++ 的区别

如果要细说两者,其实还是挺复杂的,尽管两者的代码风格上还是有一些共同之处,但是不能简单的把 C++ 认为成 C 的升级版。从另外一方面来说,相对于之前的 C++,C++11 可以算是一门全新的语言了。

另外,C++ 也兼容 C 语言的语法。我们尽可以在 C++ 中使用 C 风格的语句,但是也应该尽量遵守 C++ 的编程规范,以写出更加清晰和安全的代码。

如果你之前有 Java、C# 等其他编程语言的基础,请注意,尽管 C++ 和它们在表面上很相似,但他们之间有着概念上的不同之处。


读者可以结合 语言基础简介 - OI Wiki 页面下的内容进行本部分的阅读。