Visual C ++标准符合性
我想知道Microsoft的Visual C ++编译器是否以及在何种程度上符合当前的C(C90 / C99)和C ++(ISO / IEC 14882:2003)标准。 不幸的是,我只能找到关于这个主题的部分信息,我可能会看到所有错误的地方。
任何指向相关资源的指针都非常感谢。 提前致谢。
编辑:因为看起来这是一个最敏感的主题,我会满足于是否MSVC完全符合C90的是/否答案…我已经明白,这不是C99的情况(自然而然,我仍然不知道C ++ ..
Edit2:感谢大家的回答。 我已经接受了Rushakov先生的回答,但对所有相关答案都提出了异议,这些答案都很有帮助。
也许MSDN的 Visual C ++ 非标准行为页面会启发你吗? 确保查看您最感兴趣的版本(右侧的框)。
由于MSDN的链接一直在变化(谁知道原因),这里是VS2008上页面的主要内容,所以当链接中断并有人遇到这个答案时,他们可以在Google上找到正确的页面:
非标准行为
以下主题是C ++的Visual C ++实现与C ++标准不一致的一些已知位置。 节号是指C ++标准中的节号。
- 编译器限制
- 10.3(第5段)协变返回类型
- 14导出模板上的关键字
- 14.6.2从属名称
- 15.4函数exception说明符
- 16.3.2#运算符
- 21.1.1性格特征要求
- 对象的存储位置
我的宠儿小便,大多数程序员发现并不重要,但我个人觉得这很可能会损害可读性,因为VC ++无法编译以下C ++代码:
bool result = true and not false;
…因为VC ++不能识别and
/ or
不识别(与ISO 646的其余部分一起)作为有效令牌。
澄清 :标准提到了§2.12中对上述令牌的处理,将它们标记为§2.11中的保留,并将§2.5中的等价映射定义为更常规的运算符表示(例如and
对应于&&
)。 目前尚不清楚为什么他们会在其他关键字旁边获得特殊身份。 更令人困惑的是,附录C2.2突然称它们为“关键词”。 尽管如此,该标准对于它们的处理和语义仍然非常清楚。 VC根本不实现这些段落(除非您在编译期间指定/Za
标志)。
这是MSDN博客中的一个很好的总结,题为“ Visual C ++ 11中的C ++ 11特性 ”,于2012年3月2日更新。
Visual C ++ 2k3,2k5和2k8符合C89和C ++ 98。
从C99中挑选了一些额外的function,并且在C ++ 98之上还有一些增强function。
对于VS而言,C和C ++的标准合规性相当差。 事情随着2005年的变化而开始变化。 VS2010是我真正关注C ++ 0x的很多function。 大多数情况下,我最终使用以下关键字搜索谷歌:
- msdn ANSI C一致性
- msdn ISO C ++一致性
当我真的需要弄清楚为什么某些东西不能按照定义工作时。
我还没有使用VS 2008,所以我只能代表VS 2005。
它不支持C99。 在VC中对C89 / 90的支持一直很好,我不知道它有任何不合规问题。
C ++ 98支持存在许多问题,其中一些问题由MS记录为已知问题,一些是普通错误。 我做了一个博客文章,用作我在实践中遇到的各种VS 2005 C ++错误的“笔记本”。 如果您愿意,可以看看这里 ,虽然这个列表可能远未完成
__try被标记为扩展名