【IT168 技术文档】
当年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; }
}
C++/CLI语法
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枚举类型
在前一个语言版本中,声明类型的方法,表明了它生存和工作的方式。只有本地类、结构和托管值类型才可以创建在堆栈中,托管引用类始终在托管堆中。在Visual C++ 2005中,所有的类型,不管是本地还是托管,通过使用基于堆栈的确定性清理语义,都能被创建在堆栈中。
为在本地堆中生成类型T的一个对象实例,可使用“new T”,它返回一个指向本地堆中对象位置的指针(在Visual Studio .NET 2002和Visual Studio .NET 2003中为__nogc)。而在托管堆中生成类型T的一个对象实例,Visual C++ 2005引入了关键字gcnew,“gcnew T”将返回整个对象在托管堆中的句柄。句柄在Visual C++ 2005中被当作一个新的结构,有点类似于托管扩展的__gc指针;如今要在堆栈上生成一个类型T的实例,标准的“T t”声明就足够了。