V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ybw
V2EX  ›  问与答

c++可以跨平台了吗

  •  
  •   ybw · 2020-03-15 10:20:13 +08:00 via Android · 6600 次点击
    这是一个创建于 1740 天前的主题,其中的信息可能已经有所发展或是发生改变。

    2020 年 还有谁家的编译器和标准对着干?

    如果没有,是不是我按照 c++的标准写代码,分清哪些是未定义行为,就可以保证跨平台了?

    所有操作系统都支持 c++编程,这是 c++很有优势的地方。

    45 条回复    2020-03-16 20:11:54 +08:00
    BrettD
        1
    BrettD  
       2020-03-15 10:23:00 +08:00 via iPhone
    总是还会用到操作系统和平台相关的 API 啊
    ybw
        2
    ybw  
    OP
       2020-03-15 10:26:17 +08:00 via Android
    @BrettD 我的意思是这部分不可移植的用各个平台的最佳语言,剩下的用 c++,各种语言都能和 c++打交道。
    tigerstudent
        3
    tigerstudent  
       2020-03-15 11:16:52 +08:00 via Android
    可以。
    tulongtou
        4
    tulongtou  
       2020-03-15 11:19:22 +08:00
    除去平台 API 部分的话问题不大
    dacapoday
        5
    dacapoday  
       2020-03-15 11:38:39 +08:00
    @ybw #2 准确的说,各种语言都能和 c 打交道。即使 c++,也要 extern C
    ybw
        6
    ybw  
    OP
       2020-03-15 11:39:22 +08:00 via Android
    @dacapoday 比如?
    dacapoday
        7
    dacapoday  
       2020-03-15 11:58:23 +08:00
    @ybw #6 这还要比如? 自己查查各语言的 FFI,哪个不是和 c 对接,即使和 c++对接,多半也是 extern C。
    ybw
        8
    ybw  
    OP
       2020-03-15 12:00:55 +08:00 via Android
    @dacapoday 要啊,比如?
    msg7086
        9
    msg7086  
       2020-03-15 12:20:59 +08:00
    其实我没看懂你问的比如是比如什么。

    C 几乎就是汇编往上最靠谱的语言了。C++别的不说,光各家编译器 ABI 都还没有互通。之前做开发,VC++出来的 dll 和 G++出来的程序一连就炸,最后老老实实滚回到 C 接口。

    你如果要用 C++跨平台的话,如果能保证下面所有的依赖都由你用同一个编译器来编译的话,倒也还行。
    ybw
        10
    ybw  
    OP
       2020-03-15 12:23:19 +08:00 via Android
    @msg7086 源码级跨平台
    msg7086
        11
    msg7086  
       2020-03-15 12:31:07 +08:00
    @ybw 用新标准的话还是要小心。很多新标准里的一些功能各家编译器不一定都实现。
    比如 aligned allocation,Windows 平台下还是要用_aligned_malloc / _aligned_free,POSIX 下要用 aligned_alloc / free。
    wentaoliang
        12
    wentaoliang  
       2020-03-15 12:42:34 +08:00
    如果你只写个 hello world 那肯定跨平台,难就难在项目日益庞大,你根本就兼顾不了。。。
    ybw
        13
    ybw  
    OP
       2020-03-15 12:43:37 +08:00 via Android
    @wentaoliang 比如? 谁家的编译器不遵守 c++标准的哪一条?
    yngzij
        14
    yngzij  
       2020-03-15 12:54:00 +08:00
    windows 上直接使用 MinGw。
    cxh116
        15
    cxh116  
       2020-03-15 12:55:20 +08:00
    可以的,chrome 和 firefox 就是这样干的,至于里面有多少坑你踩过就知道了.
    ybw
        16
    ybw  
    OP
       2020-03-15 12:58:35 +08:00 via Android
    @cxh116 Chrome 第一版发布于 2008 年,开发的时间更早,那个年代还是比较混乱的吧。
    wanglufei
        17
    wanglufei  
       2020-03-15 12:58:42 +08:00 via Android
    QT
    zwy100e72
        18
    zwy100e72  
       2020-03-15 13:34:29 +08:00
    @msg7086 您这是遇到 ABI 不一致的问题了,需要区分 windows 下的 gnu abi 和 msvc abi

    C++ 源码在不同的平台上用各自合适的工具链是可以跨平台的,相应的你需要每套平台都单独编译一次
    同时 LLVM 当前支持跨语言的优化功能,你可以混用 LLVM 支持的各种语言,比如 Rust、C/C++
    geelaw
        19
    geelaw  
       2020-03-15 13:43:20 +08:00
    没有人想和 C++ 标准对着干,但是似乎不存在完美实现标准的编译器。
    ybw
        20
    ybw  
    OP
       2020-03-15 14:11:25 +08:00 via Android
    @geelaw 比如?
    easylee
        21
    easylee  
       2020-03-15 14:18:54 +08:00   ❤️ 12
    楼主四个张口就来的“比如”引人不适,建议楼下的朋友 bolck !
    PureWhiteWu
        22
    PureWhiteWu  
       2020-03-15 14:26:08 +08:00   ❤️ 1
    @easylee 同意,不想回复楼主了。
    lcdtyph
        23
    lcdtyph  
       2020-03-15 14:30:54 +08:00
    @ybw

    https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017
    https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance?view=vs-2019
    可以看看两大主流编译器对 C++17 标准实现的情况。

    https://docs.python.org/3/extending/extending.html
    python 暴漏出来的虽然是面向对象的接口,如果直接用 C++会写的很爽吧,可惜人家没这么做,接口是 C 风格的面向对象。
    msg7086
        24
    msg7086  
       2020-03-15 15:01:52 +08:00
    @zwy100e72 是的,我就是遇到了某个主流的库和生态基于 MSVC ABI,然后我二次开发的工具基于 GCC ABI 的情况。
    因为也不可能让用这个工具的人把整个生态都换掉,所以最后我还是用 C 接口重写了。
    zwy100e72
        25
    zwy100e72  
       2020-03-15 17:01:25 +08:00
    @msg7086 然而按照我的理解,GNU ABI 编译 C 也会有问题对吧
    你实际上应该是需要用 MSVC 编译 + 边界部分用 C 接口,内部是可以使用 C++的。
    (边界用 C 主要是因为 C++没有稳定 ABI )
    zwy100e72
        26
    zwy100e72  
       2020-03-15 17:02:57 +08:00
    @lcdtyph python 用 C++扩展也需要用 C 包一层的,也是因为 C++没有稳定 ABI
    jackmod
        27
    jackmod  
       2020-03-15 17:21:23 +08:00
    之前参与的一个项目是直接用跨平台的编译器,全平台 clang 一把梭……
    yidinghe
        28
    yidinghe  
       2020-03-15 17:33:34 +08:00 via Android
    反了,应该是 C++在各个平台实现统一的 API,然后其他语言再来调它的 API
    lcdtyph
        29
    lcdtyph  
       2020-03-15 17:51:48 +08:00
    @zwy100e72 #26
    嗯嗯我知道这个😁
    我就是想回答楼主那几个“比如”
    tyrantZhao
        30
    tyrantZhao  
       2020-03-15 18:07:30 +08:00
    如果编译器都是一样的话,那没问题
    ybw
        31
    ybw  
    OP
       2020-03-15 18:09:18 +08:00 via Android
    @tyrantZhao 编译器不一样
    ManjusakaL
        32
    ManjusakaL  
       2020-03-15 18:12:35 +08:00
    @ybw 多了去,,取决于版本。。

    举例,GCC 4.7 以下不支持 模板别名,GCC 4.8.1 不支持限定引用

    再举个例子,Inter C++ 编译器到现在都没完全支持 C++17

    IBM XLC++/Oracle C++ 等就更别说了。。
    ybw
        33
    ybw  
    OP
       2020-03-15 18:16:21 +08:00 via Android
    @ManjusakaL 7 年前的 gcc 不支持就算了。以 2020 年为起点计算。
    kljsandjb
        34
    kljsandjb  
       2020-03-15 20:38:01 +08:00 via iPhone
    @easylee 回复完你这条就 block😄
    zsh2401
        35
    zsh2401  
       2020-03-16 02:39:21 +08:00 via iPhone
    比如??比如??🙃
    ManjusakaL
        36
    ManjusakaL  
       2020-03-16 03:48:44 +08:00 via Android
    @ybw 还是多了去,C++17 截至目前,都没被全量支持
    msg7086
        37
    msg7086  
       2020-03-16 04:34:28 +08:00
    @zwy100e72 对,两个程序都是用 C++写的,就是边界的地方用 C 接口对接。
    waruqi
        38
    waruqi  
       2020-03-16 08:11:07 +08:00 via Android
    系统 api 部分可以用一些跨平台库,比如 boost,tbox 就能解决,其他都还好,编译的话可以试试 xmake 来跨平台编译
    pmispig
        39
    pmispig  
       2020-03-16 09:43:25 +08:00
    @cxh116 firefox 现在用 rust 啦
    yokyj
        40
    yokyj  
       2020-03-16 10:32:15 +08:00
    比如?比如?
    tyrantZhao
        41
    tyrantZhao  
       2020-03-16 12:26:01 +08:00
    @ybw 编译器不一样很麻烦,不同编译器,甚至不同版本的编译器对不同特性的支持都不一样。
    ybw
        42
    ybw  
    OP
       2020-03-16 14:02:52 +08:00 via Android
    @tyrantZhao 标准明确写的不是未定义行为,编译器也会胡来?
    behanga
        43
    behanga  
       2020-03-16 15:28:59 +08:00
    参考 chrome 的各个平台版本,里面做了大量的平台兼容问题。虽然都是用 c++标准写代码,但 c++库可各不相同。
    tyrantZhao
        44
    tyrantZhao  
       2020-03-16 16:24:16 +08:00
    @ybw 是这样的,各版本编译器对统一 c++标准支持程度不同,在一个,不同编译器的 abi 不一样,甚至 release 和 debug 也不一样,比如说 vs
    ybw
        45
    ybw  
    OP
       2020-03-16 20:11:54 +08:00 via Android
    @tyrantZhao 源码级,abi 有什么用,我在 Windows 下生成 dll,无论如何也不能拿到 macos 下直接用啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.