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編譯時不會提示錯誤,但是生成的執行代碼卻很成問題。