当年Visual Studio.NET 2003 C++编译器的面世,令无数C++语言爱好者都对此垂涎不已;它与ISO C++标准保持98%的一致——这比以前任何一个版本都更加接近,和一体化的语言支持特性,如局部模板特定化;同时也包括了增强的缓冲区安全检查和改进的编译器诊断功能。以往使用C#和Visual Basic.NET的开发者,通过简单的拖放操作,就能生成稳健的Windows窗体应用程序,如今,C++的开发者也加入了进来,而且,这个编译器还对Intel Pentium 4和AMD Athlon处理器作了优化处理。
如果Visual C++ .NET 2003都令你兴奋不已,那么它的最新版本Visual C++ 2005,足够令你高兴得发狂了。对于 .NET开发,Visual C++ 2005如今有了一套新的语法,不但显得更“优雅”,而且更强大;它拥有新的优化技术,可使程序的速度最高提高30%;同时新的编译模式,可保证在Microsoft .NET Framework之上生成完全遵从CLI(Common Language Infrastructure)的可验证代码;新的interop模式,可提供本地与托管代码的无缝融合。相对于前两个版本,新编译器还包括了一个增强版本的缓冲区安全检查选项,而且对C++程序普遍使用的库,也有新的注重安全的版本。Visual C++ 2005对基于Intel Itanium和AMD64的64位平台,提供了对OpenMP标准的支持,并且修正了一些混合DLL加载的问题,对Double P/Invoke的性能问题,提供了自动运行时消除。关于类似的增强和改进还有很多很多,正如一个C++架构师说的那样,“C++终于站在了它应该站的位置上”。
C++/CLI 新的语法
可能我们中有不少人都发现,要在前两个版本的C++中使用托管扩展语法,会非常麻烦并且错误重重,也许还会觉得,Visual C++并非是 .NET开发的首选语言。微软Visual C++开发小组在广泛听取意见的基础上,重新改进了Visual C++ 2005,在Visual Studio .NET 2002中那种笨拙的C++托管扩展语法已经一去不复返了,而修订后的语言定义带来的是一个完全充满吸引力的新语法。
在语言设计上,微软Visual C++开发小组制定了一些主要的目标。首先(对那些认为编程是艺术的人来说,也许是最重要的),他们要保证在开发者在编写C++代码时感觉自然,为达到这个目的,他们对ISO C++标准作了一个在语法上优雅的纯粹扩展,目的是为了在像单击部署、窗体设计支持和SQL Server 2005的托管代码支持这些地方,可更简单地用C++编写可验证的代码。他们想要设计出一个超过C++的语言,要带给C++全部的 .NET能力,同时也要带给 .NET全部的C++能力。现在看来,他们非常的成功。
新的扩展规范被称为“C++/CLI”,并且正在被标准化。在阅读代码时,最引人注意之处就是,以往那种在托管扩展中定义垃圾回收类、属性等等常用到的双下划线关键字,现在已成为了历史。虽然也有一些类似的关键字被保留,但由于不会被经常用到,所以不会对代码的可读性造成影响。这些双下划线关键字如今被两种新的“关键字”取代:“上下文敏感”和“空隔”。“上下文敏感”关键字是只在特定的上下文中,才是关键字;而“空隔”关键字只在联合其他关键字时,才会是关键字。例如:在托管扩展中的关键字__property已被关键字property取代(不只是这样,定义和访问属性的整个语法都被精炼了,它的声明与C#看起来很相似,参见插1),而且在你的代码中,还可以使用property作为变量名,只有在一个类型中声明属性时,“property”才会被当作一个关键字。
代码1:语法比较
托管扩展语法
| public __gc __sealed class Student { private: double m_grade; String* m_name; public: __property double get_Grade() { return m_grade; } __property void set_Grade(double newGrade) { m_grade = newGrade; } __property String* get_Name() { return m_name; } __property void set_Name(String* newName) { m_name = newName; } } |
| public ref class Student sealed { private: double m_grade; public: // 标准属性语法 property double Grade { double get() { return m_grade; } void set(double newGrade) { m_grade = newGrade; } } //其他属性 property String^ Name; } |
| class N { /*…*/ }; //本地类型 ref class R { /*…*/ }; // CLR引用类型 value class V { /*…*/ }; // CLR值类型 interface class I { /*…*/ }; // CLR界面接口类型 enum class E { /*…*/ }; // CLR枚举类型 |
![]() 图1: |
| string ReadFirstLineFromFile(string path) { StreamReader reader = new StreamReader(path); return reader.ReadLine(); }) |
| string ReadFirstLineFromFile(string path) { using (StreamReader reader = new StreamReader(path)) { return reader.ReadLine(); } } |
| Function ReadFirstLineFromFile( _ByVal path As String) As String Dim reader As StreamReader Try reader = New StreamReader(path) ReadFirstLineFromFile = reader.ReadLine() Finally If Not reader Is Nothing Then _ CType(reader, IDisposable).Dispose() End Try End Function |
| String^ ReadFirstLineFromFile(String^ path) { StreamReader reader(path); return reader.ReadLine(); } |
http://dev.xuezhishi.net/program/VC/2007-06-21/18461.html