当前位置: 主页 > 浏览 >

[译]转换指南: 将您的程序从托管扩展C++迁移到C++/CLI[1]

收藏 时间:2009-12-27 来源:查看 收藏:ymss 阅读:415 标签:语言  我们  一个  设计  关键字  部分  
Stan Lippman 微软公司 2004年8月 适用于: C++/CLI版本2 ISO-C++ 摘要: C++/CLI 为ISO-C++标准语言提供了一个动态编程范型扩展。这份文档提供了版本1语言特性和到版本2语言的迁移蓝图,指出哪里需要转换,哪里不需要转换。 内容 介绍 1. 语言关键字2. 托管类型3. 类或接口内的成员声明4 值类型及其性能5. 语言改进概述附录:推动语言改进

Stan Lippman 微软公司 20048

适用于:
    C++/CLI
版本2
    ISO-C++

摘要: C++/CLI ISO-C++标准语言提供了一个动态编程范型扩展。这份文档提供了版本1语言特性和到版本2语言的迁移蓝图,指出哪里需要转换,哪里不需要转换。

内容

介绍

1. 语言关键字
2. 托管类型
3. 类或接口内的成员声明
4 值类型及其性能
5. 语言改进概述
附录:推动语言改进设计
声明

介绍

C++/CLI ISO-C++标准语言提供了一个动态编程范型扩展。在最初的语言设计(版本1)中有很多显著的弱点,我们认为这些错误在修订语言设计(版本2)工作中已经修改过来了。这份文档提供了版本1语言特性和到版本2语言的迁移蓝图,指出哪里需要转换,哪里不需要转换。对于有兴趣的读者,我这里还提供了一个关于新语言设计基本原理的扩展。另外,我们正在开发一个源代码级别的转换工具(mscfront) 并将同C++/CLI 语言发布一起提供给需要将他们的版本1代码自动转换为新语言设计的开发人员。

这份文档分为5部分并包括一个附录。1部分讨论了有关语言关键字的诸多广泛问题,特别讨论了有关取消双下划线关键字并对上下文和空格关键字做了介绍。2部分 着眼于托管类型的改变特别讨论了托管引用类型和数组。你还可以在这里找到有关确定性结束(deterministic finalization)语义的详细讨论。有关语言的改变,包括类的成员,例如属性,目录属性,和运算符等内容将在3部分讨论4部分 着眼于CLI enums, interior,pinning pointer语法的改变。这部分同时还讨论了很多显著的改变,例如隐式装箱的介绍,CLI enums的变化,以及对类中默认构造函数支持的取消。 5部分 是一个大杂烩——一些不是很重要的杂项。例如关于cast,字符串性能,和属性数组的讨论。

1. 语言关键字

从初始语言设计到修订语言设计的一个全局转变便是去掉了所有关键字上的双下划线。例如属性现在定义为: property,而不是 __property 在初始语言设计中使用双下划线前缀有下面的两点主要原因:

  1. 这是符合ISO-C++标准定义的提供本地扩展的方法。初始语言设计的主要目标并不是要引入与标准语言不一致的因素,例如新的关键字和标记。很大程度上正是这个原因,推动了托管引用类型对象声明的指针语法的选择。
  2. 双下划线的使用除了出于考虑兼容性方面的原因外,同时也是考虑给用户提供对其现有代码不会造成任何伤害的可靠性保证。这是初始语言设计第2个主要目标。

那么为什么我们后来又取消双下划线(并且引入很多新的标记符号)呢?不,这并不是说我们将不再考虑与标准相一致!

我们仍然保持与标准相一致。尽管如此,我们意识到对CLI动态对象模型的支持表现出了一种全新的功能强大的编程范型。我们在初始语言的设计以及C++语言的设计与烟花商的经验使我们确信对这个新的范型的支持需要语言自身拥有高级的关键字和标记符号。我们在集成这个编程范型并支持标准时力图提供一个一流的表达方法。我们希望你会感到修订版语言设计提供了对这两种截然不同的对象模型的一流的编程体验。

同样,我们还充分考虑了对新语言关键字侵害的最大可能性。这已经由使用上下文关键字和空格关键字解决了。在我们着眼实际的修订语言语法之前,让我们搞清这两个特殊关键字。

上下文关键字在特定程序上下文中有特殊的意义。在通用程序中,例如,sealed 被看作普通标识符。尽管这样,当它出现在托管引用类类型声明部分时,它将被看作是该类声明上下文中的关键字。这样将在语言中引入新的关键字的潜在破坏影响降到了最低,我们认为这对于拥有现存代码的用户来说是非常重要的。与此同时,这使得新功能的用户对新增的语言特性有了一个最好的体验这部分我们认为在初始语言设计中并没有考虑。在1.1.2部分我们将看到一个sealed如何使用的例子。

空格关键字是上下文关键字的一个特例。它通过一个空格在字面上将一个现有关键字与一个上下文修饰语配对。这个配对结果被看作是一个单独的单元,例如值类(实例参见1.1部分),而不是看成两个独立的关键字。在实际的术语中,这代表的宏重定义,以下面为例,

#ifndef __cplusplus_cli

#define value

这并不能将(value)从类定义中消除。如果想要达到这样的效果,可以采用如下方法重定义这个单元对

#ifndef __cplusplus_cli

#define value class class

考虑到实际的因素,这是非常必要的;否则,很可能与现有空格关键字上下文关键字部分的#define 变换重叠。


顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论 所有评论
你还没登录,请先登录后再来评论!
推荐内容
新知先觉