正在阅读:C++语言风格流变史C++语言风格流变史

2005-05-19 15:11 出处: 作者:王咏刚 责任编辑:xietaoming

3. OWL和MFC——窗口环境下的风格变异

    20世纪80年代末到90年代初,X Window、Mac OS、Windows等窗口环境的先后出现为程序设计提出了新的课题,而C++语言兼顾面向对象和传统开发方法的特性无疑使其成为了窗口环境下编程语言的最佳选择。一批基于C++语言的窗口框架不仅在商业上取得了成功,也在很大程度上改变了C++语言本身的风格特点。

    最早在窗口开发中赢得大多数程序员青睐的C++框架是Borland公司于1992年内置在Borland C++ 3.1中的OWL(Object Windows Library)框架库。下面这段代码取自Borland C++ 3.1的示例程序:

class TGDIDemoWindow : public TMDIFrame
{
public:
  TGDIDemoWindow( LPSTR ATitle, LPSTR MenuName )
    : TMDIFrame(ATitle, MenuName) {};
  virtual void SetupWindow();
  virtual void ArtyDemo( TMessage& ) =
    [CM_FIRST + ArtyDemoID];
  virtual void Quit( TMessage& ) =
    [CM_FIRST + QuitID];
  virtual void WMTimer( TMessage& ) =
    [WM_FIRST + WM_TIMER];
  virtual void WMDestroy( TMessage& ) =
    [WM_FIRST + WM_DESTROY];
};

    为了解决窗口编程中最关键的消息映射问题,OWL的设计者为C++语言的成员函数引入了“=[…]”的古怪语法,这是许多用过Borland C++的程序员至今都无法忘怀的一种语言风格。我承认,Borland公司在C++语言的发展初期为我们提供了最好的编译器和最出色的集成开发环境(IDE),但Borland通过OWL框架为C++引入的另类语言风格的确让人不敢恭维(客观地讲,这笔账也不应全算在Borland头上,因为OWL的前身是Borland从White Water公司购买的框架代码)。

    就在Borland C++ 3.1统治市场两年以后,Microsoft凭借其当仁不让的霸气和著名的Visual C++系列产品逐渐夺回了Windows开发工具市场的主导权。与Borland不同的是,Visual C++中的MFC(Microsoft Foundation Class)框架库没有向OWL那样肆意篡改C++的语法,而是采用了下面这样的方式来实现消息映射(代码取自MSDN示例程序):

// Example for BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP( CMyWindow, CFrameWnd )
    ON_WM_PAINT()
    ON_COMMAND( IDM_ABOUT, OnAbout )
END_MESSAGE_MAP( )

    事实上,用MFC框架编写的C++代码在大量使用宏定义等预编译指令的同时,还把WIN32平台下常见的匈牙利风格(有关标识符大小写和前缀的书写规范)发挥到了极限。这一点用不着我多费口舌,许多程序员仅从代码的大小写特征上就能百分之百地确定代码中是否使用了MFC框架。

    很遗憾,MFC为C++打造的语言风格并没有得到C++专家们的首肯。例如,包括Stroustrup在内的许多学者都建议我们尽量少用甚至不用宏定义等预处理指令。在这一点上,MFC的做法显然和专家们的论调背道而驰。应当说,是Microsoft的霸气造就了MFC的巨大成功;但从纯粹的语言学角度看,MFC在语言风格上的贡献远不如它在窗口框架技术方面的贡献大。

4. 模板——现代C++风格的基础

    Stroustrup于1988年首次公布了与模板(template)有关的语法设计。毫无疑问,这是一项对现代C++的语言风格影响最大的技术改进。模板的概念来自Clu语言,并综合了Smalltalk和Ada语言中相关技术的优点。1991年后,包含模板机制的开发环境(DEC C++、IBM C++、Borland C++等)陆续问世。但直到1995年STL(Standard Template Library)模板库逐渐发展成熟以后,模板技术才在程序员中迅速普及开来。

    下面的例子取自SGI STL的示例代码,它基本反映了使用模板技术后C++代码的整体风格:

template <class InputIterator, class T>
InputIterator find(InputIterator first,
    InputIterator last, const T& value)
{
    while (first != last && *first != value)
        ++first;
    return first;
}

    在这样的C++代码中,除了少数几个关键字和操作符以外,我们几乎找不到多少C语言的痕迹了。模板技术兼顾了类型安全和编码灵活性的双重需求,但它同时也为C++语言引入了一种更加精妙但也较难理解(相对于没有模板的代码而言)的代码风格。许多传统的C语言拥护者讨厌这种风格的代码,但更多的新生代程序员对其钟爱有加。1998年,在ANSI/ISO标准化委员会的支持下,STL被作为标准C++库(Standard C++ Library)的一部分收入了C++国际标准之中。今天,以模板、异常等现代C++技术为代表的语言风格也已在事实上成为了C++世界的“官方风格”。

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品