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