1
wevsty 2018-02-05 22:43:54 +08:00
如果想写出来的代码跨平台或者具有高度兼容性建议不要用任何不在标准里的方法(包括特性,依赖于实现过程的奇淫技巧)。
有些坑只有你自己踩到才知道,依赖于没有规定实现过程的而又因为实现正好能使用的东西,也许下一个版本就全 over 了。 逃~~~ |
2
lifanxi 2018-02-05 22:53:17 +08:00
研究差异意义不大,保证你自己只用标准上有的行为就行了。
|
4
lifanxi 2018-02-06 10:28:12 +08:00
@sgissb1
学东西不是为了面试。就你说的那个面试题,没问题。考的时你对这个东西的理解。如果他直接问你 GCC 4.3 跟 VS2015 的 STL 中对 iterator 的实现有什么差别,那就是他的不对了,除非你应聘的职位就是要做编译器或者相关的。 不能因果倒置。要按标准来,理解形成标准背后的原理。可以结合具体的实现来理解,并且在这个过程中知道某个特定的实现中有什么“奇淫技巧”。而不是花时间专门去研究每个特定实现中有什么区别。 |
5
sgissb1 OP @lifanxi 哥们,不要一上来就讲道理,我并不是为了面试。我之所以提面试时有人问,是因为其他原因。有时候面试时,问问题也能够侧面提现者面试官的素质(心理素质和技能素质)。
至于我为啥要问各方言版本的差异,你为啥不问问,一上来就讲道理呢? |
7
gnaggnoyil 2018-02-06 20:48:27 +08:00
具体到 C++,奇技淫巧和是否符合标准之间没有必然关系,倒不如说不符合标准的奇技淫巧都不好意思说自己是奇技淫巧(逃
具体到主贴这个例子,任何 STL 容器的 iterator 是否会被 invalidate 以及在何时会被 invalidate 作为 STL 接口的一部分都是被写在标准文档里的.所以这和各个实现的差异没有关系,毕竟敢于公开声明自己无视 ISO C++标准的实现到目前为止一个都没有——换句话说,C++各个实现中几乎没有形成符合大众认知的所谓"方言"的东西,根据各个实现公开的文档所描述的东西之间的差异大部分不超过对于 C++(不同版本)标准的实现的差异.而 C++标准及其各个版本的差异在 cppreference 里都可以按照词条查到——比如主贴所说的 iterator 问题.当然,早已向公众公开的 ISO C++标准草案(及其历史版本们)毫无疑问则是更权威的一个资料来源. 当然不怕一万就怕万一.真的要折腾不同实现的差异的情况也不是没有.比如某些实现对于标准的支持程度就是呵呵,再比如需要折腾 impl-defined 或者一些编译器扩展.我接触过的编译器不多,碰到这种情况我通常会查阅各个编译器自己的文档.比如 msvc 就上 https://docs.microsoft.com/en-us/cpp/cpp/c-cpp-language-and-standard-libraries , GCC 就上 https://gcc.gnu.org/onlinedocs/ , Clang 就上 https://clang.llvm.org/docs/ ,无论是查标准支持差异,还是实现定义行为,或是对标准的扩展,都是可以轻松查到的. |
8
sgissb1 OP @gnaggnoyil 非常感谢认真回复和后续提供的资料查询链接。
要是怕踩到坑,尤其是有些开源代码很喜欢写带 gnu 扩展的方言代码。比如老版本的 vs 在 c++方言上的处理也存在差异。 一个是拿来汇集整理资料,后续踩到坑好查,c++iso 标准那坨玩意太厚了,看得想睡觉,所以想找快查表。 |