有没有现代编译器不支持旧标准的例子?

2019-09-08 12:22:10 +08:00
 leoleoasd

如题. 跟同学讨论, 同学坚持认为 vc6.0 上写的代码在 vs2008 以及 vs2019 上无法运行, 我则认为除非微软 sb 否则新编译器肯定支持旧标准. (我二者都没用过)

4014 次点击
所在节点    问与答
31 条回复
ysc3839
2019-09-08 14:21:56 +08:00
C++新标准有弃用旧标准的,具体有哪些不太清楚,印象中有一个是字符串字面量不能赋值给 char* 的变量。
C 语言的话 C11 弃用了不安全的 gets,需要用 gets_s 或者 fgets 替代。

不过显然不是所有代码都无法运行,小心写的话还是可以的。
bumz
2019-09-08 15:16:25 +08:00
有啥好讨论的,试一下不就得了
就算有肯定也是少数,稍微改一下就好

双方理由再充分也都是自己 YY
haiyang1992
2019-09-08 15:18:15 +08:00
太新的 gcc 连旧的 gcc 都编译不了。。
secondwtq
2019-09-08 15:27:53 +08:00
VC/VS 啥时候成标准了 ...
首先,C++ 编译器的前端是逻辑很复杂的东西(特别还有一堆扩展),在维护的时候出 bug 不小心 break 掉之前的代码挺正常的,一般针对 C++ 编译器,有很多公开的和内部的 test suite 来尽量使这种事情不会发生,但是这显然并不是一个完全的保证。任何 C++ 编译器出 bug 都是很正常的事情,另外我不知道楼主听没听说过 bug-to-bug compatible 这个东西 ...

从更广义的角度讲,任何对于开发平台和依赖的迁移都应该评估可能造成的影响,这和标准不标准无关,任何语言的任何版本的编译器 /库更新都可能引入新的 bug

注意 C++ 这个语言的模式是 WG21 定标准,不同的 vendor 做实现,Bjarne 原来的实现早就不知道扔哪去了。你在不同的实现之间迁移的时候也会遇到类似的问题,同时还会遇到 extension 不兼容的问题(还会遇到 ABI 的问题 ...),包括看上去是同一个 extension,不同的 compiler 会有不同的实现。

还有一种模式是没有 spec,实现就是 de facto standard。TypeScript 貌似是这样。OCaml 这种尽管是偏学术的语言,但是好像还是没有 spec,并且可以有 breaking change ( https://github.com/gasche/ocaml-releases-change-explanation/wiki/4.05.0-changes-explanation),一个其他语言用户见不到的奇观是
check.ocamllabs.io ——为了官方发布新版本的升级过程更平滑,有人专门做了一个网站来监控所有包在新版编译器上的构建状况,因为社区小,所以这个事情可行。但是仔细看其中大多数都是第三方库等周边生态导致的问题,编译器本身还是尽量保持稳定的。Haskell 虽然有个标准当摆设,但是谁都看得出 GHC 是 de facto standard,所以同理 ...(典型: https://gitlab.haskell.org/ghc/ghc/wikis/migration/7.10 )。

LLVM 不算是用户直接接触的编译器,但是简单来说 LLVM IR 的兼容性就是随缘,尤其是对于非核心部分。OpenGL、OpenCL 和 SPIRV 等作为工业标准,标准是分版本发布的,各个 vendor 通过提 extension 的方式加私货,每个 extension 都有自己的 ID。实现上则用 版本号+extension 集合 的方式标识兼容性,Khronos 官方提供 Conformance Test Suite。我觉得这个做得是比 C++ 要更成熟一点的。

至于楼主的问题,我认为对于学生项目来讲,这个没有太大的问题。这里涉及到一个比较现实的问题是 MSVC 的编译器版本和开发环境版本是绑定的,你想用新的环境必须用新的编译器。这个不完全是个好事也不完全是个坏事。需要注意的是现在“开发环境和编译器版本绑定”已经是一个不限于微软的趋势了——越来越多的编程语言开始更多地在交互开发体验上发力,微软的 C# 本来做得就很优秀,但是后来通过开源的 Roslyn 更进了一步。C++ 社区则有 Clang 梦,不对,是 Clang 的伟大复兴,不对,应该叫 Clang 崛起 ... 总的来说是开发环境的工具越来越依赖于编译器自身的 API,这部分一般是没有兼容性保证的,并且挺容易 break 的。

一些优秀的 C++ 项目的编码规范里面规定的不仅仅有项目使用哪个 C++ ISO 标准开发,还有当前兼容的编译器**最小版本**,因为规定“使用 C++14 开发”之类的是没用的,你还得考虑编译器自身实现的问题

很多 C++ 项目本来就有跨平台的需求,这样所要面临的环境和工具链差异会更大,然而这些项目确实做到了。
你并不必需把你自己的项目也做成跨平台的,也并不必需使用标准 C++ 开发。但是我认为处理编译器和平台之间正常的兼容性问题是干活的程序员的必备能力之一,就像前端需要处理浏览器差异一样。

微软官方的解释: https://docs.microsoft.com/en-us/cpp/porting/overview-of-potential-upgrade-issues-visual-cpp

另外为什么没人黑一下 Python 呢?
ReVanTis
2019-09-08 15:28:56 +08:00
你的做法是对的,有新的为什么用旧的,尤其是学习阶段。
难道是为了要学一堆现在不支持的“特性”吗?
secondwtq
2019-09-08 15:36:00 +08:00
thedrwu
2019-09-08 18:41:29 +08:00
以前写 C/C++喜欢指定 register、auto,后来编译器优化智能了,不需要手动。再后来 C++11 里 auto 的意义也不一样了。
zzj0311
2019-09-08 20:27:39 +08:00
vc6.0 创建的项目直接拿到 vs2019 去编译我印象里是会报错的,但是和编译器还真没啥关系
weixiangzhe
2019-09-08 21:42:06 +08:00
这门课划水就好啦,大学生还是要脱离课本 通过网络学习
mxalbert1996
2019-09-08 22:34:17 +08:00
@secondwtq 现在 VS 的 IDE 和编译器版本已经不是绑定的了,最新版本的 IDE 也可以装旧版本的工具集。
ysc3839
2019-09-08 22:42:23 +08:00
@mxalbert1996 没记错的话从 VS2015 才开始把 MSVC 分离的。曾经 Python 2.x 官方用的是 VC++ 2008 编译的,要编译安装第三方包的话需要装整个 VS 才有 MSVC,然后当时的 VS 还捆绑 C# 等功能(这个好像是 2017 才改掉的)。最后微软还专门给 Python 搞了个独立的 MSVC。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/598991

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX