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被标记为扩展名