颜林林的个人网站

现代C++学习笔记(1):工具资源篇

2022-01-10 00:00

Image (题图来自网络并做适当修改)

所谓“工欲善其事,必先利其器”。计算机语言学习,是非常依赖实践的。所以,在正式开始《Effective Modern C++》阅读之旅前,先准备下C++编译环境,是非常有必要的。同时,我也打算借这篇文章,给大家分享一些重要且常用的C++相关资源。

1

首先说编译器,这是重点的重点。“编译”是将人工可以阅读的计算机语言的代码,转换成相应功能的二进制机器指令的过程。所以说,编译器首先应该能够准确识别计算机语言的语法,然后再能将其准确翻译成为计算机能够“理解”(其实是按照预期正确运行)的指令。这样我们才能围绕这门语言,开展实际的编程工作,并解决我们想解决的问题。

如之前的开篇文《现代C++学习笔记(0):开篇》提到的,C++最近十年经历了相当快速的发展,每三年就会推出一个新版本的标准。而这些标准都需要有编译器进行实现,我们才能真正使用起来。而编译器的开发,本身就是非常复杂的,而要快速跟进并支持这些新标准,可以说是一件非常有挑战性的事情。正因为如此,能够满足我们需求的工具,其实主要也就有限的那么几个:gcc、clang 和 MSVC。

2

下面就分别介绍下这三个编译器。

gcc,这是GNU Compiler Collection的缩写。其实它包含了多种不同语言的支持,C、C++、Objective-C,Fortran,Ada,Go以及D,包括这些语言的编译器本身,也包含相应的运行时库(runtime library)。其中对C++语言的编译器(或其命令名),叫做g++。这是最值得推荐的,因为它的更新速度应该是最快的,很多还在形成标准的特性,都可能已经实现在其中。详细可以参见链接:https://gcc.gnu.org/projects/cxx-status.html

clang,这是Mac系统上Xcode所标配的重要C/C++编译器。在Mac上进行开发,首选自然就是安装Xcode。早年的Xcode应该也缺省使用gcc,后来转到llvm与clang的技术线来。安装完成后,打开终端(Terminal或iTerm2),就可以直接使用相应的编译器工具命令。相对于gcc那么“包罗万象”,clang的历史包袱没那么大,因此在语言解析方面更清晰也更有优势。这也是很多对编译原理感兴趣的人,更钟爱clang的原因。

MSVC,这是由微软开发的C++编译工具包,缩写自Microsoft Visual C++。MSVC的推广,得益于其Windows操作系统的市场垄断地位。微软的历史悠久,仔细研究过Windows API和MFC(Microsoft Foundation Class) Library设计的人,就会发现很多C++的理念和标准,与微软操作系统发展,有很大渊源。MSVC曾经制定的一些非标准扩展,后来都逐步进到了C++语言标准。对此有兴趣的,不妨读读侯捷老师的经典图书《深入浅出MFC》,这是用从头实现一个简版MFC的方法,来窥探巨无霸Windows及其程序设计原理的有趣实践。

以上几个工具,都可以设法在本地安装和使用。对于使用Windows系统的人,如果想使用gcc,推荐选择WSL(Windows Subsystem for Linux)的方案,此处可参见我昨天写的图文教程《如何在Windows环境中使用Linux?》。

不过如果只是做简单的语言学习(而不是为了真正开发一些中型或大型软件项目),其实还有更方便的选择,就是一些在线编译网站。比如:

OnlineGDB:https://www.onlinegdb.com/

Programiz:https://www.programiz.com/cpp-programming/online-compiler/

CODEChef:https://www.codechef.com/

IDEone:https://www.ideone.com/

在这些网站上面,可以很方便地进行调试,并随时进行不同版本编译器(包括不同标准)的切换和对比。

3

接下来,介绍一些C++语言参考网站。

关于语言标准,最官方的网站,自然是ISO C++标准委员会:https://isocpp.org/。对C++最新前沿发展感兴趣的,不妨在这个网站上多浏览研究。

然而,对语法特性更系统性的参考网站,当属CppReference:https://en.cppreference.com/。日常遇到某个函数不清楚其语法和功能时,在这个网站上查询,基本都可以得到满意的答案,而且它会清晰地标示出哪些用法来自什么版本的标准,或是在哪个标准时开始被宣布废弃。

关于语法参考,微软的MSDN自然是另一个重磅支持,同样值得强烈推荐:https://docs.microsoft.com/en-us/cpp/cpp/cpp-language-reference。如前所述,微软在C++语言方面的贡献,也决定了它所整理形成的知识库,深度和准确度都是顶级的。

在C++的世界中,官方标准支持库是STL(Standard Template Library),而另一个虽然非官方、但却是事实标准的,则是Boost库:https://www.boost.org/。这个库充满很多神奇的“看似不可能”的实现,而这些实现经常会在未来成为新一代的语言标准。C++技术栈的人总喜欢发明轮子,因为绝大多数人都互相鄙视,总会觉得用别人的库,不如自己重新实现的好。而STL和Boost具有超越这种鄙视网的强大影响力,使得最优秀的人们都在往这个“超库”(它其实是很多很多库组成的)中贡献最智慧的代码。

4

此外,再分享几个不错的链接资源:

C++ Conference:https://cppcon.org/

Bjarne Stroustrup’s homepage:https://www.stroustrup.com/

Fluent C++:https://www.fluentcpp.com/

C++ Tips of the Week:https://abseil.io/tips/

C++ Stories:https://www.cppstories.com/

最后,再推荐一些C++经典书籍:

《C++ Primer》、《C++ Primer Plus》 《Effective C++》、《More Effective C++》、《Effective Modern C++》 《Exceptional C++》 《Essential C++》 《Imperfect C++》

《C++ Templates》

《深度探索C++对象模型》

话不多说,这篇就这样。

下一篇开始,我们进入现代C++编程的正题。

--- END ---

注:本文首发表于“不靠谱颜论”公众号,并同步至本站。

相关文章