2020 年 还有谁家的编译器和标准对着干?
如果没有,是不是我按照 c++的标准写代码,分清哪些是未定义行为,就可以保证跨平台了?
所有操作系统都支持 c++编程,这是 c++很有优势的地方。
|  |      1BrettD      2020-03-15 10:23:00 +08:00 via iPhone 总是还会用到操作系统和平台相关的 API 啊 | 
|      2ybw OP @BrettD 我的意思是这部分不可移植的用各个平台的最佳语言,剩下的用 c++,各种语言都能和 c++打交道。 | 
|  |      3tigerstudent      2020-03-15 11:16:52 +08:00 via Android 可以。 | 
|  |      4DonaidTrump      2020-03-15 11:19:22 +08:00 除去平台 API 部分的话问题不大 | 
|  |      7dacapoday      2020-03-15 11:58:23 +08:00 @ybw #6 这还要比如? 自己查查各语言的 FFI,哪个不是和 c 对接,即使和 c++对接,多半也是 extern C。 | 
|  |      9msg7086      2020-03-15 12:20:59 +08:00 其实我没看懂你问的比如是比如什么。 C 几乎就是汇编往上最靠谱的语言了。C++别的不说,光各家编译器 ABI 都还没有互通。之前做开发,VC++出来的 dll 和 G++出来的程序一连就炸,最后老老实实滚回到 C 接口。 你如果要用 C++跨平台的话,如果能保证下面所有的依赖都由你用同一个编译器来编译的话,倒也还行。 | 
|  |      11msg7086      2020-03-15 12:31:07 +08:00 @ybw 用新标准的话还是要小心。很多新标准里的一些功能各家编译器不一定都实现。 比如 aligned allocation,Windows 平台下还是要用_aligned_malloc / _aligned_free,POSIX 下要用 aligned_alloc / free。 | 
|      12wentaoliang      2020-03-15 12:42:34 +08:00 如果你只写个 hello world 那肯定跨平台,难就难在项目日益庞大,你根本就兼顾不了。。。 | 
|      13ybw OP @wentaoliang 比如? 谁家的编译器不遵守 c++标准的哪一条? | 
|  |      14yngzij      2020-03-15 12:54:00 +08:00 windows 上直接使用 MinGw。 | 
|  |      15cxh116      2020-03-15 12:55:20 +08:00 可以的,chrome 和 firefox 就是这样干的,至于里面有多少坑你踩过就知道了. | 
|  |      17wanglufei      2020-03-15 12:58:42 +08:00 via Android QT | 
|      18zwy100e72      2020-03-15 13:34:29 +08:00 @msg7086 您这是遇到 ABI 不一致的问题了,需要区分 windows 下的 gnu abi 和 msvc abi C++ 源码在不同的平台上用各自合适的工具链是可以跨平台的,相应的你需要每套平台都单独编译一次 同时 LLVM 当前支持跨语言的优化功能,你可以混用 LLVM 支持的各种语言,比如 Rust、C/C++ | 
|  |      19geelaw      2020-03-15 13:43:20 +08:00 没有人想和 C++ 标准对着干,但是似乎不存在完美实现标准的编译器。 | 
|  |      21easylee      2020-03-15 14:18:54 +08:00  12 楼主四个张口就来的“比如”引人不适,建议楼下的朋友 bolck ! | 
|  |      22PureWhiteWu      2020-03-15 14:26:08 +08:00  1 @easylee 同意,不想回复楼主了。 | 
|  |      23lcdtyph      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 风格的面向对象。 | 
|  |      24msg7086      2020-03-15 15:01:52 +08:00 @zwy100e72 是的,我就是遇到了某个主流的库和生态基于 MSVC ABI,然后我二次开发的工具基于 GCC ABI 的情况。 因为也不可能让用这个工具的人把整个生态都换掉,所以最后我还是用 C 接口重写了。 | 
|      25zwy100e72      2020-03-15 17:01:25 +08:00 @msg7086 然而按照我的理解,GNU ABI 编译 C 也会有问题对吧 你实际上应该是需要用 MSVC 编译 + 边界部分用 C 接口,内部是可以使用 C++的。 (边界用 C 主要是因为 C++没有稳定 ABI ) | 
|      27jackmod      2020-03-15 17:21:23 +08:00 之前参与的一个项目是直接用跨平台的编译器,全平台 clang 一把梭…… | 
|  |      28yidinghe      2020-03-15 17:33:34 +08:00 via Android 反了,应该是 C++在各个平台实现统一的 API,然后其他语言再来调它的 API | 
|      30geminikingfall      2020-03-15 18:07:30 +08:00 如果编译器都是一样的话,那没问题 | 
|      31ybw OP @tyrantZhao 编译器不一样 | 
|      32ManjusakaL      2020-03-15 18:12:35 +08:00 @ybw 多了去,,取决于版本。。 举例,GCC 4.7 以下不支持 模板别名,GCC 4.8.1 不支持限定引用 再举个例子,Inter C++ 编译器到现在都没完全支持 C++17 IBM XLC++/Oracle C++ 等就更别说了。。 | 
|      33ybw OP @ManjusakaL 7 年前的 gcc 不支持就算了。以 2020 年为起点计算。 | 
|  |      35zsh2401      2020-03-16 02:39:21 +08:00 via iPhone 比如??比如??🙃 | 
|      36ManjusakaL      2020-03-16 03:48:44 +08:00 via Android @ybw 还是多了去,C++17 截至目前,都没被全量支持 | 
|  |      38waruqi      2020-03-16 08:11:07 +08:00 via Android 系统 api 部分可以用一些跨平台库,比如 boost,tbox 就能解决,其他都还好,编译的话可以试试 xmake 来跨平台编译 | 
|      40yokyj      2020-03-16 10:32:15 +08:00 比如?比如? | 
|      41geminikingfall      2020-03-16 12:26:01 +08:00 @ybw 编译器不一样很麻烦,不同编译器,甚至不同版本的编译器对不同特性的支持都不一样。 | 
|      42ybw OP @tyrantZhao 标准明确写的不是未定义行为,编译器也会胡来? | 
|      43behanga      2020-03-16 15:28:59 +08:00 参考 chrome 的各个平台版本,里面做了大量的平台兼容问题。虽然都是用 c++标准写代码,但 c++库可各不相同。 | 
|      44geminikingfall      2020-03-16 16:24:16 +08:00 @ybw 是这样的,各版本编译器对统一 c++标准支持程度不同,在一个,不同编译器的 abi 不一样,甚至 release 和 debug 也不一样,比如说 vs | 
|      45ybw OP @tyrantZhao 源码级,abi 有什么用,我在 Windows 下生成 dll,无论如何也不能拿到 macos 下直接用啊 |