简化.NET装配库
发表于:2007-06-30来源:作者:点击数:
标签:
Microsoft .NET的受管C++最终大大简化了构造更准确.NET装配库的方式。这种简化主要是由装配库的自我说明特性所带来的。这对受管C++ 程序员 具有怎样的意义呢?实际上,以往在建立传统C++库时精心创建的各种头文件在装配代码的情况下已不再成为必要的组成部分
Microsoft .NET的受管C++最终大大简化了构造更准确.NET装配库的方式。这种简化主要是由装配库的自我说明特性所带来的。这对受管C++
程序员具有怎样的意义呢?实际上,以往在建立传统C++库时精心创建的各种头文件在装配代码的情况下已不再成为必要的组成部分了(除了出于维护的目的)。
从个人观点看,我认为维护头文件是令人痛苦的,所以我当然很高兴这些头文件能从我的视野中消失。在编程的时候我经常忘记用来索引库所需要的一个或者多个头文件,而且我还不得不找遍包含文件的内容来检索丢失数据类型的定义。更糟糕的是,把源代码分成两半令我始终不得不在纠正错误的处境下工作。比如我就经常犯下这样的错误,忘了把所有的包含文件打包或者令.h和.cpp文件没有保持同步。
由于装配过程中不再需要头文件了,所以你可以用新型的、经过改进的方法构造源文件。但在讨论到这些方法之前,先不妨让我们看看创建装配的传统方法是怎么回事。
传统方法
创建库的传统C++方法是这样的,首先建立一套说明库内各个功能的头文件。接着,在各个源文件里实现这些头文件中定义的全部功能。每一个源文件连同其关联的头文件,经过编译器编译之后产生目标文件,所有的目标文件再连接起来形成库文件。图A显示的就是以上的传统过程。
图A
创建库的传统方式
为了要采用这些头文件呢?原因是,有了它们,在以后引用类的时候,所有的类、结构和变量等等都能得到方便的定义。
产生装配也可以采用同样的方式。唯一的差别是必须设置受管C++标志。
以下在清单A、B、C和D中显示的示例对如何用传统C++方法创建装配进行了说明。
清单A 显示Cards.h头文件中的内容。该文件定义了处于Cards 名称空间中的enum类型Suits类和Card类。注意,在受管C++语言中,关键词public要放在enum和类的前面,两者都需要接受公共访问。
清单B 显示的是对类的构造器和成员方法的实现。清单C定义了第2个类:Deck。注意, Card类就用在Deck类的内部,然而其头文件中却没有对它进行声明。实际上,在编译过程中,头文件会整个一堆地粘贴到源文件里去。所以,我们只要在Deck.cpp源文件的Deck.h之前包含Card.h文件就可以了。这样,Card类首先粘贴,因而,Deck类也就获得了需要的定义。
清单D 显示了最终生成库的源文件。注意,正如我们先前提到的那样, Card.h包含在Deck.h之前。
在命令行环境下创建库的命令很简单。语法如下:
cl source1.cpp source2.cpp ... sourceN.cpp /CLR /LD /o OutputName.dll
C++编译器会获取源文件的名字列表。然后读取/CLR参数,等于告诉编译器我们正在使用受管扩展。然后,/LD参数告诉连接器创建.dll,最后/o参数告诉要创建的.dll文件的名称。
编译以上的例子执行如下命令即可:
cl card.cpp deck.cpp /CLR /LD /o cards.dll
新型的装配方法
由于不再需要分离头文件和源文件,所以我们可以利用新举措对库进行编码。首先,只用一个类(.h)文件对类进行编码——包括其定义和实现等。然后用单一的连接(.cpp)文件包含所有的类文件。这里唯一要注意的就是一定要把类文件放到正确的地方以便在用到它之前各种对象都能准确定义。不过,这个小麻烦不也是传统方法也要遭遇的吗?图B显示了新型的装配过程。
图B
新型的装配方法
采用以上方法,你只需要维护一半数量的文件了。因为定义和源代码都放到了一起,所以它们不可能失去同步。结果,维护库的任务也变得相当简单。此外,文件的可读性大大提高,文档只需要放在一个地方即可,这真是个好法子。
清单E、F和G则显示以上创建的同一库,但采用了这种新方法。
正如你看到的那样,清单E是传统方法下的Card.h和Card.cpp文件。基本上替代了分离文件的定义方法,我就是直接把实现代码放到了类定义中。
同样的,清单F则是传统Deck.h和Deck.cpp文件的组合。同传统方法一样,你可以在这一类的范围内访问其他类而不必在文件中定义后者。连接器需要保证类定义放在了正确的位置以便它们能在用到之前得到定义。
清单G 中的连接文件是唯一与众不同的文件,因为它只包含了include声明。受管C++编译器只编译.cpp文件,所以为了让编译器能多管点事,你就得有这个文件。这种文件的便利之处在于从库内添加或者删除类变得方便多了,你只需要把组成库的所有类都放在某一位置即可。在
开发过程中,连接器文件是存放
测试代码的绝佳位置。
这种构造装配库的方法可以把编译运行命令简化到下面的地步:
cl cards.cpp /CLR /LD
小结
自我说明的装配有可能会大大简化我们的编码方式,主要原因是不再需要把源代码模块分解为源文件和头文件。文中的举例清楚地显示出构造装配库的新方法所带来的莫大益处。
原文转自:http://www.ltesting.net