VC++ 6.0编译作为一个高效的.NET程序语言。其混合了函数语言和物件导向程序编制语言,并且***的适用于编程、算法、技术和探索性开发,因此可以在使用的过程当中感受到趣味性和吸引力。
和VS 6.0这个产品的成熟相比,VC++ 6.0的编译器的的确确相对来说有些糟糕,其中最被诟病的是对模板技术支持很不好。下面我想做的一件事情,就是向那些继续留恋VC++ 6.0的朋友,介绍一些小花招,来避开VC++ 6.0的一些编译器缺陷。
按照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.0的for语句看起来符合C++标准,你可以这样做:
- if (cond)
- if (1)
- for (int i = 0; i < 100; ++i)
- func1();
- else
- func2();
你会发现很有趣,这样define一下后,VC++ 6.0编译的for语句完全符合C++标准了!而且由于编译器的优化,Release版本不会增加任何额外的开销。喜欢“钻牛角尖”的朋友可能会说:嗯,不错的主意。但是——为什么不这样做:
- template <class T1, class T2>
- T1 func(T2 arg)
- {
- T1 var;
- ... // 处理var过程
- return var;
- }
- void test()
- {
- int result1 = func<int>(1);
- double result2 = func<double>(2);
- };
很抱歉,这种用法VC++ 6.0不支持。让人恼火的是,VC++ 6.0编译时不会提示错误,但是生成的执行代码却很成问题。
【编辑推荐】