V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuser666
V2EX  ›  程序员

求 C++书籍推荐

  •  
  •   liuser666 · 2020-06-07 18:06:56 +08:00 · 3527 次点击
    这是一个创建于 1637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前我一直在鼓捣前端的东西,最近想回归本质看点 C++和 Rust

    其实原本就对 lib,dll 等有一些了解,c++语法也基本掌握。

    但其实在使用的时候略有困惑,

    我发现我找的书大多都之中阐释 C++语法和特性,模板啊,类啊什么的,但很少有书说一说 idea 怎么用的,动态链接库怎么链接的,如何配置,或者说 cmake 怎么用的,编译器的各个参数说明等等...

    所以各位大神有没有什么针对性比较强的书籍可以推荐一下呢?🤕

    其实我觉得 C 相关的历史包袱都挺重的,有一些不成文的规定,约定俗称的东西会对初学者造成障碍。

    26 条回复    2020-06-08 14:11:54 +08:00
    allAboutDbmss
        1
    allAboutDbmss  
       2020-06-07 18:13:21 +08:00   ❤️ 1
    - 动态链接库怎么链接: compiler linker
    - cmake 怎么用: 应该直接学 cmake 看文档吧
    - 编译器的各个参数: `> man gcc`

    你想学的基本和 c++无关,因为你关注的地方不是 c++和 c 的区别。书籍可以看纯理论的操作系统和体系结构的书,应该会有某个章节相关联(下面的课件链接中有书):

    推荐一个课的课件:
    - https://db.in.tum.de/teaching/ss19/c++praktikum/?lang=de
    - https://db.in.tum.de/teaching/ss20/c++praktikum/?lang=de
    misaka19000
        2
    misaka19000  
       2020-06-07 18:17:17 +08:00   ❤️ 1
    mit 好像最近刚开了一门课,专门就是讲这个的
    misaka19000
        3
    misaka19000  
       2020-06-07 18:17:48 +08:00   ❤️ 2
    liuser666
        4
    liuser666  
    OP
       2020-06-07 18:33:29 +08:00 via iPhone
    @misaka19000 非常感谢,我去看看
    liuser666
        5
    liuser666  
    OP
       2020-06-07 18:35:15 +08:00 via iPhone
    @allAboutDbmss 我也知道可以去查文档...但是文档其实偏向于给已经会的人查缺补漏的,从学习的角度还是希望找更有侧重点的教程哈。
    zhuangzhuang1988
        6
    zhuangzhuang1988  
       2020-06-07 18:54:40 +08:00
    <深入理解计算机系统>
    看这个就可以了

    至于配置啥的,看说明文档
    liuser666
        7
    liuser666  
    OP
       2020-06-07 19:05:41 +08:00 via iPhone
    @zhuangzhuang1988 我感觉就像计算机网络和 Cisco 软件的关系一样,虽然题目我都能做出来,但是在 Cisco 里配置包括现实中配置的时候总有一些...心慌?可以用,但总感觉不是现行的最佳模式,还是希望看看真正实战,你们是怎么用的。
    nightwitch
        8
    nightwitch  
       2020-06-07 19:53:40 +08:00   ❤️ 4
    你碰到了 C/C++最难的一部分,就是 C++的 ABI 问题和它的生态工具问题。绝大多数 C++教材都回避这一问题,或者简化的介绍一下 GCC 或者 MSVC,对为什么 gcc10.0 无法链接 gcc4.9 编译的库, 哪怕代码是合法的这种问题避而不谈。

    这一部分就是三不管地带,全靠码农在成千上万个 undefined symbol 和无数次的 segmentfault(core dumped)中淌过来的。

    cmake 相关的可以看,里面包含了如何链接动态链接库的问题
    https://llvm.org/docs/CMakePrimer.html
    https://cliutils.gitlab.io/modern-cmake/
    liuser666
        9
    liuser666  
    OP
       2020-06-07 20:08:06 +08:00 via iPhone
    @nightwitch 原来如此,您的回答击中了我的一些痛点,有些时候代码没有问题但是配置总是不对,各种报错,我一开始以为是我学习方向出现问题了,还是非常感谢!
    liuser666
        10
    liuser666  
    OP
       2020-06-07 20:21:46 +08:00 via iPhone
    @nightwitch 还有 gcc msvc clang 编译器之间的一些差异,这个支持这个特性,那个支持那个特性,语法也有差异,哎,难搞。
    lifanxi
        11
    lifanxi  
       2020-06-07 20:34:02 +08:00 via Android   ❤️ 1
    Linkers and loaders 可以看看。
    还有俞甲子的《程序员的自身修养》。
    natsji
        12
    natsji  
       2020-06-07 20:36:56 +08:00 via Android
    liuser666
        13
    liuser666  
    OP
       2020-06-07 20:37:38 +08:00 via iPhone
    @natsji 哈哈哈哈
    liuser666
        14
    liuser666  
    OP
       2020-06-07 20:38:24 +08:00 via iPhone
    @lifanxi 好的!
    nightwitch
        15
    nightwitch  
       2020-06-07 20:54:05 +08:00
    @liuser666 一般只提倡使用标准 ISOC++,只在自己知道哪些是编译器扩展的情况下使用编译器扩展,每个编译器都会掺自己的私货,所以要对编译器掺杂的私货要特别清楚。
    比如这段代码
    https://paste.ubuntu.com/p/YFt2NjzqYr/
    g++默认情况无条件给过并且不报 warning, 要开-Wpedantic 才会给 warning, clang 默认条件下直接报错误。
    这段代码不是标准的 C++代码,VLA 不属于 C++标准。
    liuser666
        16
    liuser666  
    OP
       2020-06-07 21:46:34 +08:00
    @nightwitch 学到了学到了,非常感谢。
    fengjianxinghun
        17
    fengjianxinghun  
       2020-06-07 22:18:47 +08:00
    @nightwitch 经历过 gcc/clang/msvc Msbuild/Xcode project cmake/automake/autoconf make/ninja 之类的各种千奇百怪的玩意。

    Rust 的 cargo 欢迎你
    czdpzc
        18
    czdpzc  
       2020-06-07 22:40:34 +08:00
    @nightwitch 说的好,全靠自己摸爬滚打😂 这里面可有太多弯路了
    @misaka19000 有意思的课程,多谢分享
    liuser666
        19
    liuser666  
    OP
       2020-06-07 23:03:07 +08:00
    @fengjianxinghun 确实觉得 rust 省心很多,但是 C 的历史包袱重带来的好处是大家几乎都有用 C,还是得懂 C 才能学 rust 。
    oven
        20
    oven  
       2020-06-07 23:34:53 +08:00 via Android
    推荐 程序员的自我修养
    augustheart
        21
    augustheart  
       2020-06-08 09:07:03 +08:00 via Android
    1.idea 不是用来写 c++的,那是写 JAVA 的。
    2.我猜你想说的是 ida,这部分内容不属于 c++,请参阅 ida 说明文档
    3.动态链接库的知识属于操作系统范畴,依然不属于 c++。你要查阅 pe 格式文档以及 windows 载入器部分的知识。
    4.动态链接库没有配置的问题。
    5.cmake 参阅 cmake 官方文档,挺详细的,虽然啰嗦复杂,但是语法很简单,就是很简单的 ifelse 和一些系统环境变量以及 cmake 变量。
    6. 编译器各个参数说明,gcc 是有很详细的说明的,cl 的话用 cl /?能看到。不复杂,大部分望文生义,至少是比 gcc 那套简洁多了。
    7 你说的所有内容都不属于 c++的范畴上,正如 idea 不是 java 的内容一样。充其量是胡须与吉列剃须刀的关系,也不像某贴说的是最难的内容。相反,这些内容都是很直白的 1+1=2,都有具体的资料(即使是不在 c++规范中的 abi 定义),相比起费脑的算法题,这些死记硬背就可以了。问题在于这部分内容多且繁,基本上不会有几个人会把它完整地学习,就好像我刮胡子不需要了解怎么造某个特定的剃须刀一样,用 gcc 的人没必要了解它在所有平台下面的特定指令。大部分人了解了-o 和-O 就可以用起来了。
    liuser666
        23
    liuser666  
    OP
       2020-06-08 09:51:02 +08:00
    @augustheart 输入法自动填充写成 idea 了...其实我想说的是 IDE (集成开发环境 hiahiahia )
    liuser666
        24
    liuser666  
    OP
       2020-06-08 09:57:36 +08:00
    @augustheart 是这样,在调用 dll 库的时候很可能遇到一些问题,比如调用的 dll 库与编译器不兼容啊,需要额外的参数啊这样这样,小细节有点多...还有一般教材上都用的 gcc 所以我之前用的是 gcc,现在正在转换成 clang 。
    augustheart
        25
    augustheart  
       2020-06-08 10:24:19 +08:00 via Android
    @liuser666 abi 兼容是不在规范里面的,所以跨编译器调用对 c++来说是不应该考虑的。不光是不同编译器,即使 clang 也并不保证你在不同版本的 clang 之间是能兼容的。这个也不独独是 c++的问题,别的语言多多少少有类似的东西。
    MarkLeeyun
        26
    MarkLeeyun  
       2020-06-08 14:11:54 +08:00
    makefile 先学一下还是有必要的,多用 linux 写 c/c++
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1386 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:37 · PVG 01:37 · LAX 09:37 · JFK 12:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.