现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34196 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

21 | 工具漫谈:编译、格式化、代码检查、排错各显身手

C++ Insights
compiler-explorer
Compiler Explorer
nvwa
MSVCRT.DLL console I/O bug
Homebrew
C++ compiler support
“libc” C Standard Library
clang_complete
Vim Online
The growth of modern C++ support
Announcing: MSVC conforms to the C++ standard
Programming languages—C++extensions for coroutines
Concurrency Runtime
std::regex
Use the official range-v3 with MSVC 2017 version 15.9
Rejuvenating the Microsoft C/C++ compiler
Clang: a C language family frontend for LLVM
GCC, the GNU Compiler Collection
Visual Studio
个人推荐的工具
哪些工具比较有用
展示模板的展开过程
展示源代码和汇编对应
对程序运行性能影响小
小巧
内存查错和多线程问题分析
非侵入式排错工具
强调发现代码可能出问题的地方
轻量级工具
提供现代化代码建议
静态检查工具
展示模板的展开过程
提供完善的配置项
智能格式化
初期出错信息友好程度不佳
跨平台
自由软件的代表
在macOS下默认C/C++编译器
模块化设计
对C++标准支持飞速
错误信息易用性好
对C++17标准全面支持
对并发领先
对标准库实现较快
对模板支持不佳
历史悠久
C++ Insights
Compiler Explorer
nvwa::debug_new
Valgrind
Cppcheck
Clang-Tidy
C++ Insights
Clang-Format
GCC
Clang
MSVC
课后思考
网页工具
排错工具
代码检查工具
格式化工具
编译器
工具漫谈:编译、格式化、代码检查、排错各显身手

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
现代 C++ 语言,我们讲到这里就告一段落了。今天我们正式开启了实战篇,先讲一个轻松些的话题——工具。

编译器

当然,轻松不等于不重要。毕竟,工欲善其事,必先利其器。我们做 C++ 开发,最基本的工具就是编译器,对其有些了解显然也是必要的。我们就先来看看我在专栏开头就提到的三种编译器,MSVC [1]、GCC [2] 和 Clang [3]

MSVC

三种编译器里最老资格的就是 MSVC 了。据微软员工在 2015 年的一篇博客,在 MSVC 的代码里还能找到 1982 年写下的注释 [4]。这意味着 MSVC 是最历史悠久、最成熟,但也是最有历史包袱的编译器。
微软的编译器在传统代码的优化方面做得一直不错,但对模板的支持则是它的软肋,在 Visual Studio 2015 之前尤其不行——之前模板问题数量巨大,之后就好多了。而 2018 年 11 月 MSVC 宣布终于能够编译 range-v3 库,也成了一件值得庆贺的事 [5]。当然,这件事情是值得高兴的,但考虑我在 2016 年的演讲里就已经用到了 range-v3,不能不觉得还是有点晚了。此外,我已经提过,微软对代码的“容忍度”一直有点太高(缺省情况下,不使用 /Za 选项),能接受 C++ 标准认为非法的代码,这至少对写跨平台的代码而言,绝不是一件好事。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了现代C++编译器选择指南,重点介绍了MSVC、GCC和Clang三种主要的C++编译器。MSVC在传统代码优化和并发方面表现不俗,适合Windows开发;GCC作为自由软件的代表,跨平台性更好,但在出错信息的友好程度上有所欠缺;Clang在错误信息易用性和对C++标准的支持方面表现出色,尤其在模块化设计和动态库方面有优势,是macOS下的默认C/C++编译器。此外,文章还介绍了Clang-Format、Clang-Tidy、Cppcheck等格式化工具和代码检查工具,以及Valgrind和nvwa::debug_new等排错工具。总的来说,MSVC适合Windows开发,而Clang则在跨平台和错误信息友好性方面表现突出。读者可以根据项目需求和个人偏好选择合适的编译器和工具,以提高开发效率和代码质量。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • Geek_71d4ac
    想知道在vim上写C++,有没有比较好的插件推荐,谢谢

    作者回复: 看我的 Vim 配置,我用到的这些和 C++ 开发有关: clang_complete nerdcommenter(注释) vim-fugitive(git) vim-gitgutter(git) code_complete echofunc 另外,我在 .vimrc 里加了下面几句来集成 clang-format: " Key mappings to use clang-format noremap <silent> <Tab> :pyxf /usr/local/opt/llvm/share/clang/clang-format.py<CR> inoremap <silent> <C-F> <ESC>:pyxf /usr/local/opt/llvm/share/clang/clang-format.py<CR>i

    2020-01-13
    5
    17
  • tt
    嗯,我说老师的代码怎么是我订阅的课程里显示最友好的呢!👍

    作者回复: 工具很重要。😎

    2020-01-13
    2
    10
  • 廖熊猫
    看到C++ Insights这个工具了,跟大家分享一下这段总结的关于递归模板的几个心得吧。 根据老师讲的这几种,我把这几种分类成: 1.数值、2.拉取、3.打包。 1. 数值型:操作数值(一般是减去),然后到达一个终止条件(一般是等于0),例如factorial 2. 拉取型:从...中每次拉取一个数值跟第一个参数进行操作,合并成一个参数,继续拉取过程,直到后面...中的参数被用光,终止条件就是指剩一个参数,例如: sum 3. 打包型: 从第一个参数中分离出一个参数进入...参数包中,然后继续这个过程,直到第一个参数达到终止条件,例如: make_index_sequence 只是个人见解,希望能对大家有点帮助。

    作者回复: 挺好。这确实是最常见的几种用法。

    2020-01-13
    8
  • tokamak
    我看到公司的算法库都用intel的icc编译器编译的,算法的同事说icc编译器编译的代码性能会好一些,对于计算密集型的程序是否可以用icc编译器代替gcc?

    作者回复: 你可以对照下面链接看一下,你需要的 C++ 功能在 ICC 里是不是支持了: https://en.cppreference.com/w/cpp/compiler_support 初看之下,似乎问题不大。但性能问题,还是需要实测的。 如果发现有问题(性能或功能),混合编译器也是可以考虑的,虽然管理上会复杂点。可以考虑把需要 ICC 编译的东西放单独的项目,编译成库,供其他项目使用。

    2020-02-02
    2
  • 泰一
    老师您好,之前看了这篇文章了解到您的代码排版使用了clang-format适配小屏,涨了一些姿势。最近在个人微信公众号也写了些技术文章,但是苦恼于使用了一些在线转换工具将markdown写的文章转移到微信公众号,排版真的不太优雅,尤其是代码的排版,要不就是混乱,要不就是没有向您一样的语法高亮,要不就是文字字体太难看。很喜欢您的排版风格,所以您能推荐下您使用的markdown转换到微信的工具嘛,谢谢老师👨‍🏫

    作者回复: 我对微信公众号不熟。不过,搜了一下,发现这个网站,也许对你有用: https://md.qikqiak.com/

    2020-03-21
    1
  • 花晨少年
    一直在ubuntu用clion+bazle进行项目编译,感觉挺好用的,但是macbook这套方案没法用,很蛋疼。

    作者回复: Bazel?那你只能找Bazel和JetBrains的人解决这个兼容性问题了,我可没办法。😅 或者改用CMake?我看了下Bazel的介绍,没觉得它比CMake好。特别是,CMake有不少特别的对C++的支持,包括对不同的编译器、Boost的库链接选项、C++标准,等等。

    2020-01-13
    2
    1
  • 三味
    cpp中第三方库的管理超麻烦,x86或x64,release或debug,从vc6到最新的vs2019,windows下第三方库管理起来太麻烦了。 那么,有没有一种好用的第三方库管理呢? 如果用vs2015以上,超推荐使用vcpkg啊!就连生成汇编参考的那个网页工具,都大大咧咧的横幅推荐vcpkg,好用到爆啊! 如何使用不多说了,如何好用提一下。命令行安装对应的库,工具会进行漫长的编译。要引用这个库,只需要#include对应的头文件,lib库会自动加载,dll会在运行的时候拷贝。就这样。

    作者回复: 名气是挺响了。我没有使用经验……

    2020-01-13
    1
  • 当初莫相识
    老师,最近VS2022+Qt写项目,但是乱码问题始终不能很好解决。主要是文件编码这块,服务器传来的数据是UTF-8,而VS默认gbk,把文件编码改成UTF-8 bom还是不行,编译器及调试都是gbk进行的。不知道老师对于这块有没有好的解决方案

    作者回复: 源代码如果用UTF-8加BOM字符肯定是可以的。你从服务器读取的数据,用Qt自身的机制来处理,应该也是可以处理不同编码的。 我不用Qt,查了下,Qt可以支持UTF-8编码,内部则使用UTF-16,这样对于调试器也应该没问题才对。 https://wiki.qt.io/Strings_and_encodings_in_Qt 建议再看看第11讲,理解清楚底层的细节。搞清楚问题原因,总是可以解决的。

    2022-09-03归属地:上海
  • 常振华
    windows上的代码编辑器source insight

    作者回复: Source Insight 好像有点老了吧?以前曾经是不错的工具,但上次看别人用,对现代 C++ 代码的解析能力似有不足(但我没有亲身使用经验)。价格也有点贵。

    2021-11-15
  • 土土人
    关于排错,debug相关没有什么信息啊??

    作者回复: 调试器平台相关,网上你也能够找到足够的关于 IDE、WinDBG、GDB 的信息,我这边讨论就意义不大了。

    2021-10-26
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部