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

tow*_*owi 5 iso c++-cli

微软C++/CLI是建立 C++标准(C++ 98或C++ 11)之上,还是只是"相似"并且有偏差?

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

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

Han*_*ant 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采用的语法.如同nullptr,override,finalenum class.实际上,它有点问题,它__nullptr能够区分托管和本机空指针.他们从来没有为枚举类找到一个很好的解决方案,你必须公开它才能得到一个托管枚举类型.一些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++的语法映射到外来类型系统.


Ste*_*ser 5

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

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

配置属性 - >常规 - >公共语言运行时支持

甚至Bjarne Stroustrup也称CLI为扩展:

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

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