C ++ / CLI是标准ISO C ++的扩展吗?

时间:2014-08-06 07:03:43

标签: c++-cli iso

微软是C++/CLI在C ++标准(C ++ 98或C ++ 11)的顶层上构建还是只是“相似”并且有偏差?

或者,具体来说,是每个符合C ++程序(C ++ 98或C ++ 11)的ISO标准,还是符合C ++ / CLI程序的?

注意:我解释上面的维基百科文章只是将C ++ / CLI与MC ++进行比较,而不是ISO标准C ++。

2 个答案:

答案 0 :(得分:8)

当然,它是C ++ 03的扩展,可以编译任何与添加的关键字不冲突的兼容C ++ 03程序。它唯一不支持的是C ++的一些微软扩展,这种扩展与托管代码执行基本上不兼容,如__fastcall和__try。 MC ++是他们的第一次尝试,通过在所有添加的关键字前加下划线来保持兼容。语法相当强制,并没有得到客户的好评,C ++ / CLI放弃了这种做法,并且具有更直观的语法。 C ++ Primer成名的Stanley Lippman大量参与了btw。

可以使用#pragma managed在托管和本机代码生成之间切换编译器,该产品是包含MSIL和本机机器代码的.NET混合模式程序集。从本机C ++源生成的MSIL并不完全等同于C#或VB.NET编译器生成的类型。它并没有神奇地成为可验证的并且没有得到垃圾收集器的爱,你可以轻易地破坏堆或者堆栈。并且没有优化器也喜欢,MSIL在运行时被转换为机器代码,并且像普通的托管代码一样进行优化,具有抖动固有的时间限制。将太多原生C ++代码转换为MSIL是一个非常常见的错误,编译器将其隐藏得很好。

C ++ / CLI值得注意的是引入了后来被C ++ 11采用的语法。与nullptroverridefinalenum class一样。有点问题,实际上,它生成__nullptr以便能够区分托管和本机空指针。他们从未找到枚举类的绝佳解决方案,您必须将其声明为 public 才能获得托管枚举类型。一些C ++ 11扩展可以工作,很少有超出它已有的扩展, auto 很好但没有lambda表达式,在.NET编程中相当大。该语言自2005年以来一直被冻结。

C ++ / CX语言扩展也是值得注意的,它使得为Store和Phone应用程序编写C ++代码变得可口。语法类似于C ++ / CLI,包括ref class和语法中的帽子。但是,如果对象分配了ref new而不是gcnew,则后者会产生误导。否则非常在运行时与C ++ / CLI不同,您将从C ++ / CX中获得纯本机代码。语言扩展隐藏了下面的COM互操作代码,自动引用计数对象,将错误代码转换为异常并映射泛型。与C ++ / CLI语法的相似之处并非偶然,它们基本上执行相同的角色。将类似C ++的语法映射到外部类型系统。

答案 1 :(得分:5)

CLI是标准C ++的一组扩展。 CLI完全支持标准C ++并添加更多内容。因此,每个C ++程序都将使用启用的CLI进行编译,除非您使用CLI保留字,这是扩展的弱点,因为它不遵循扩展的双下划线规则(此类保留字必须以{{1}开头})。

您可以通过以下方式在GUI中停用这些扩展程序:

  

配置属性 - >一般 - >公共语言运行时支持

甚至Bjarne Stroustrup calls CLI一个扩展程序:

  

关于要调用C ++的CLI绑定/扩展的困难和有争议的问题,我更喜欢C ++ / CLI作为“ISO C ++的CLI扩展”的简写。保持C ++作为名称的一部分提醒人们什么是基本语言,并将有助于使用C ++ / CLI扩展将C ++保持为C ++的适当子集

语言扩展总是可以被称为与标准的偏差,因为它不能在没有CLI支持的情况下使用编译器进行编译(例如__指针)。