符合Visual C++标准

Mic*_*kis 14 c standards visual-studio

我想知道Microsoft的Visual C++编译器是否以及在何种程度上符合当前的C(C90/C99)和C++(ISO/IEC 14882:2003)标准.不幸的是,我只能找到关于这个主题的部分信息,我可能会看到所有错误的地方.

任何指向相关资源的指针都非常感谢.提前致谢.

编辑:因为看起来这是一个最敏感的主题,我会满足于是否MSVC完全符合C90的是/否答案...我已经明白,这不是C99的情况(自然而然,我仍然不知道C++ ..

Edit2:感谢大家的回答.我已经接受了Rushakov先生的回答,但对所有相关答案都提出了异议,这些答案都很有帮助.

Mar*_*off 14

也许MSDN的 Visual C++ 非标准行为页面会启发你吗?确保查看您最感兴趣的版本(右侧的框).

由于MSDN的链接一直在变化(谁知道原因),这里是VS2008上页面的主要内容,所以当链接中断并有人遇到这个答案时,他们可以通过Google找到正确的页面:

非标准行为

以下主题是C++的Visual C++实现与C++标准不一致的一些已知位置.节号是指C++标准中的节号.


Kon*_*lph 5

我的宠儿小便,大多数程序员发现并不重要,但我个人觉得这很可能会损害可读性,因为VC++无法编译以下C++代码:

bool result = true and not false;
Run Code Online (Sandbox Code Playgroud)

...因为VC++无法识别and,or并且not(与ISO 646的其余部分一起)作为有效令牌.

澄清:标准提到了§2.12中对上述令牌的处理,将它们标记为§2.11中的保留,并将§2.5中的等价映射定义为更常规的运算符表示(例如and对应&&).目前尚不清楚为什么他们会在其他关键字旁边获得特殊身份.更令人困惑的是,附录C2.2突然称它们为"关键词".尽管如此,该标准对于它们的处理和语义仍然非常清楚.VC根本不实现这些段落(除非您/Za在编译期间指定标志).

  • 适合我.VS2005,/ Za (3认同)
  • AndreyT:不,你肯定是错的; 它们是关键字,它们在标准中定义(查找它!)并且它们不*要求包含`<ciso646>`以便在完全兼容的编译器上工作. (3认同)
  • @AndreyT:我的不好,他们不是*关键字*.但是,§2.12将它们定义为预处理器令牌,它们在转换阶段7中转换为令牌.因此它们*是有效标点符号的一部分.*更多要点*,§2.5是规范性的,并定义了从预处理器标记到操作符标记的备用标记映射.这些包括有向图和来自§2.11/表4的所有令牌.... VC编译器(尽管有`/ Za`标志)没有正确实现§2.5和§2.12. (3认同)
  • @Konrad Rudolph:不,标准没有列出任何关键字.完整的关键字表格在2.11/1中可用,表格中没有这些标记.第2.11节确实有另一个带有这些替代标记的表,但它明确指出这些只是替代标记并且它们是保留的.2.11中没有任何内容将这些标记称为"关键字". (2认同)
  • (续)第C2.2.2节简单地扩展了这一点.它不是"规范性的",因为它没有定义任何新的东西,它只是使区别更清楚,即它解释了,因为2.11 /表4中的标记已经定义,它们不再需要(因此不应该) be)在`<ciso464>`中表示为宏.这就是C2.2.2的意思.将其与C2.2.1进行比较,其中包含关于`wchar_t`的非常类似的解释.同样,`wchar_t`*是*C++标准中的关键字.总之:附录C2.2只是所有变化的*摘要*.... (2认同)
  • (续)总之:虽然C2.2不是规范性的,但§§2.5和2.12当然是.(C2.2称这些令牌为"关键词"只会增加混乱.) - 我现在将编辑我的原始答案以使其更清晰. (2认同)