Friday, November 17, 2006

vc6.0的小技巧

部分内容转载自:http://blog.csdn.net/xushiweizh/archive/2006/11/16/1388949.aspx

Visual Studio系列中产品中,Visual Studio 6.0是最经典的一个版本,虽然后来有Visual Studio .NET 2003,以及2005,也确实添加了很多让我觉得激动的特性,但是从使用细节的细腻程度上来看,VS 6.0无疑是最棒的。我们一些同事甚至试图把2005C++编译器独立的拿到Visual Studio 6.0中来用,也不愿意升级到.NET上来用,可见其魅力。

 

VS 6.0这个产品的成熟相比,VC++ 6.0的编译器的的确确相对来说有些糟糕,其中最被诟病的是对模板技术支持很不好。下面我想做的一件事情,就是向那些继续留恋VC++ 6.0的朋友,介绍一些小花招,来避开VC++ 6.0的一些编译器缺陷。

 1for (type var=expression;;) 中变量var的作用域问题。

 

按照C++标准,这里定义的变量var出了for循环应该被销毁。也就是说下面这段代码是有效的:

 

   for (int i = 0; i < 100; ++i)

       func();

   for (int i = 0; i < 100; ++i)

       func2();

 

而下面这段代码应该编译不过:

 

    for (int i = 0; i < 100; ++i)

    {

         if (has_found_it())

         {

             handle_find_result();

             break;

          }

    }

    if (i == 100)

         do_not_found();

 

然而VC++ 6.0对于第一段代码会报变量i重复定义错误,而第二段代码编译通过。

 

为了让VC++ 6.0for语句看起来符合C++标准,你可以这样做:

 

   #define for if (0); else for

 

你会发现很有趣,这样define一下后,VC++ 6.0for语句完全符合C++标准了!而且由于编译器的优化,Release版本不会增加任何额外的开销。

 

喜欢"钻牛角尖"的朋友可能会说:嗯,不错的主意。但是――为什么不这样做:

 

   #define for if (1) for

 

嗯?看起来也可以。还是让我们看一个用例:

 

   if (cond)

      for (int i = 0; i < 100; ++i)

          func1();

   else

       func2();

 

进行宏代码展开后,成为:

 

   if (cond)

       if (1)

           for (int i = 0; i < 100; ++i)

               func1();

       else

           func2();

 

这个结果显然不能符合我们的原意。这里func2();语句永远得不到执行机会。

 

Elliot Liu

No comments: