ybw
V2EX  ›  问与答

c++可以跨平台了吗

  •  
  •   ybw · Mar 15, 2020 via Android · 7463 views
    This topic created in 2427 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

    C++ 源码在不同的平台上用各自合适的工具链是可以跨平台的,相应的你需要每套平台都单独编译一次
    同时 LLVM 当前支持跨语言的优化功能,你可以混用 LLVM 支持的各种语言,比如 Rust、C/C++
    geelaw
    geelaw
    Mar 15, 2020
    19
    没有人想和 C++ 标准对着干,但是似乎不存在完美实现标准的编译器。
    ybw
    ybw
    OP
    Mar 15, 2020 via Android
    20
    @geelaw 比如?
    easylee
    easylee
    Mar 15, 2020❤️12
    21
    楼主四个张口就来的“比如”引人不适,建议楼下的朋友 bolck !
    PureWhiteWu
    PureWhiteWu
    Mar 15, 2020❤️1
    22
    @easylee 同意,不想回复楼主了。
    lcdtyph
    lcdtyph
    Mar 15, 2020
    23
    @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
    msg7086
    Mar 15, 2020
    24
    @zwy100e72 是的,我就是遇到了某个主流的库和生态基于 MSVC ABI,然后我二次开发的工具基于 GCC ABI 的情况。
    因为也不可能让用这个工具的人把整个生态都换掉,所以最后我还是用 C 接口重写了。
    zwy100e72
    zwy100e72
    Mar 15, 2020
    25
    @msg7086 然而按照我的理解,GNU ABI 编译 C 也会有问题对吧
    你实际上应该是需要用 MSVC 编译 + 边界部分用 C 接口,内部是可以使用 C++的。
    (边界用 C 主要是因为 C++没有稳定 ABI )
    zwy100e72
    zwy100e72
    Mar 15, 2020
    26
    @lcdtyph python 用 C++扩展也需要用 C 包一层的,也是因为 C++没有稳定 ABI
    jackmod
    jackmod
    Mar 15, 2020
    27
    之前参与的一个项目是直接用跨平台的编译器,全平台 clang 一把梭……
    yidinghe
    yidinghe
    PRO
    Mar 15, 2020 via Android
    28
    反了,应该是 C++在各个平台实现统一的 API,然后其他语言再来调它的 API
    lcdtyph
    lcdtyph
    Mar 15, 2020
    29
    @zwy100e72 #26
    嗯嗯我知道这个😁
    我就是想回答楼主那几个“比如”
    GeminiPro
    GeminiPro
    Mar 15, 2020
    30
    如果编译器都是一样的话,那没问题
    ybw
    ybw
    OP
    Mar 15, 2020 via Android
    31
    @tyrantZhao 编译器不一样
    ManjusakaL
    ManjusakaL
    Mar 15, 2020
    32
    @ybw 多了去,,取决于版本。。

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

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

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