妙用VC++ 6.0編譯器說(shuō)明
VC++ 6.0編譯作為一個(gè)高效的.NET程序語(yǔ)言。其混合了函數(shù)語(yǔ)言和物件導(dǎo)向程序編制語(yǔ)言,并且***的適用于編程、算法、技術(shù)和探索性開(kāi)發(fā),因此可以在使用的過(guò)程當(dāng)中感受到趣味性和吸引力。
和VS 6.0這個(gè)產(chǎn)品的成熟相比,VC++ 6.0的編譯器的的確確相對(duì)來(lái)說(shuō)有些糟糕,其中最被詬病的是對(duì)模板技術(shù)支持很不好。下面我想做的一件事情,就是向那些繼續(xù)留戀VC++ 6.0的朋友,介紹一些小花招,來(lái)避開(kāi)VC++ 6.0的一些編譯器缺陷。
按照C++標(biāo)準(zhǔn),這里定義的變量var出了for循環(huán)應(yīng)該被銷(xiāo)毀。也就是說(shuō)下面這段代碼是有效的:
- for (int i = 0; i < 100; ++i)
- func();
- for (int i = 0; i < 100; ++i)
- func2();
而下面這段代碼應(yīng)該編譯不過(guò):
- for (int i = 0; i < 100; ++i)
- {
- if (has_found_it())
- {
- handle_find_result();
- break;
- }
- }
- if (i == 100)
- do_not_found();
然而VC++ 6.0對(duì)于***段代碼會(huì)報(bào)變量i重復(fù)定義錯(cuò)誤,而第二段代碼編譯通過(guò)。為了讓VC++ 6.0的for語(yǔ)句看起來(lái)符合C++標(biāo)準(zhǔn),你可以這樣做:
- if (cond)
- if (1)
- for (int i = 0; i < 100; ++i)
- func1();
- else
- func2();
你會(huì)發(fā)現(xiàn)很有趣,這樣define一下后,VC++ 6.0編譯的for語(yǔ)句完全符合C++標(biāo)準(zhǔn)了!而且由于編譯器的優(yōu)化,Release版本不會(huì)增加任何額外的開(kāi)銷(xiāo)。喜歡“鉆牛角尖”的朋友可能會(huì)說(shuō):嗯,不錯(cuò)的主意。但是——為什么不這樣做:
- template <class T1, class T2>
- T1 func(T2 arg)
- {
- T1 var;
- ... // 處理var過(guò)程
- return var;
- }
- void test()
- {
- int result1 = func<int>(1);
- double result2 = func<double>(2);
- };
很抱歉,這種用法VC++ 6.0不支持。讓人惱火的是,VC++ 6.0編譯時(shí)不會(huì)提示錯(cuò)誤,但是生成的執(zhí)行代碼卻很成問(wèn)題。
【編輯推薦】