?? 關于borland c++builderx的一些問題的回答.htm
字號:
· <a href=/article/5/11/2006/200608301360.html title='Google排名—搜索引擎登記技巧'>Google排名—搜索引..</a><br>
· <font color='#0066FF'>[圖文]</font> <a href=/article/10/2006/200608291188.html title='菜鳥安全防患之餓死木馬'>菜鳥安全防患..</a><br>
· <a href=/article/9/2006/20060827361.html title='數學最大數字'>數學最大數字</a><br>
· <a href=/article/10/2006/200608291195.html title='Google搜索技巧(6):用Google找自己'>Google搜索技巧(6):..</a><br></td>
</tr>
<tr>
<td height="2" bgcolor="#FFFFFF"></td>
</tr>
</table>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="titleback1">相關文章</td>
</tr>
<tr>
<td height="100" valign="top">· <a href="/article/1/14/2006/2006092518379.html" title='一次關于C++BuilderX的討論'>一次關于C++Builder..</a><br>
· <a href="/article/1/14/2006/2006092518371.html" title='Kingofark關于學習C++和編程的50個觀點2003修訂版'>Kingofark關于學習C..</a><br>
· <font color='#0066FF'>[圖文]</font> <a href="/article/1/14/2006/2006092518334.html" title='C++對象模型之一 關于對象筆記'>C++對象模型之..</a><br>
· <font color='#0066FF'>[圖文]</font> <a href="/article/1/14/2006/2006092518328.html" title='C++對象模型之一 關于對象'>C++對象模型之..</a><br>
· <font color='#0066FF'>[圖文]</font> <a href="/article/1/14/2006/2006092518167.html" title='關于用 C++Builder 進行 MIDAS 應用開發的討論'>關于用 C++Bu..</a><br>
· <a href="/article/1/14/2006/2006092518150.html" title='BlueDog 關于標準C++的有關問題的解答'>BlueDog 關于標準C+..</a><br>
· <a href="/article/1/14/2006/2006092518147.html" title='深度探索C++對象模型第一章 關于對象'>深度探索C++對象模型..</a><br>
· <a href="/article/1/14/2006/2006092518144.html" title='關于編程風格的討論'>關于編程風格的討論..</a><br>
· <a href="/article/1/14/2006/2006092518133.html" title='關于如何解決C++ Builder中DBLookupComboBox不能輸入的問題:'>關于如何解決C++ Bu..</a><br>
· <a href="/article/1/14/2006/2006092518046.html" title='關于 Apollo VCL 6.0 EVAL版超期使用的說明 :)'>關于 Apollo VCL 6...</a><br></td>
</tr>
</table>
</td>
<td width="588" align="right" class="tableright">
<table width="575" border="0" cellpadding="0" cellspacing="0" style="table-layout:fixed;word-break:break-all">
<tr>
<td align="center" height=32 style="font-size: 12pt;color: #FF6600;">關于Borland C++BuilderX的一些問題的回答</td>
</tr>
<tr>
<td align="center" height=25 bgcolor=#F7F7F7>作者:佚名 來源:不詳 發布時間:25/09/2006 19:36:00 發布人:admin</td>
</tr>
<script language=javascript>
var newasp_fontsize=9;
var newasp_lineheight=12;
</script>
<tr>
<td><p align="right"><a style="CURSOR: hand; POSITION: relative" onclick="if(newasp_fontsize>8){NewaspContentLabel.style.fontSize=(--newasp_fontsize)+"pt";NewaspContentLabel.style.lineHeight=(--newasp_lineheight)+"pt";}" title="減小字體"><img src="/images/1.gif" border="0" width="15" height="15"><font color="#FF6600">減小字體</font></a>
<a style="CURSOR: hand; POSITION: relative" onclick="if(newasp_fontsize<64){NewaspContentLabel.style.fontSize=(++newasp_fontsize)+"pt";NewaspContentLabel.style.lineHeight=(++newasp_lineheight)+"pt";}" title="增大字體"><img src="/images/2.gif" border="0" width="15" height="15"><font color="#FF6600">增大字體</font></a>
</p>
<div id="NewaspContentLabel" style="display:block;padding:0px 10px;" class="ContentFont"><FONT id=font_word style="FONT-SIZE: 14px; FONT-FAMILY: 宋體, Verdana, Arial, Helvetica, sans-serif"><P dir=ltr style="MARGIN-RIGHT: 0px">左輕侯<BR>2003.10.20</P><P> 在Borland發布C++BuilderX前后的這一段時間里,我在CSDN上陸續看到了不少關于C++BuilderX(以下簡稱CBX)的討論。作為Borland中國公司負責快速開發工具和開發者社群關系的工程師,我認為我有必要對大家的一些疑問和猜測進行回答。<BR>需要說明的是,我并沒有得到Borland公司的正式授權來做這個回答,因此下列文字,不一定等同于Borland公司的官方觀點;我只是把從我這個角度看到的一些東西,盡量和大家進行溝通。如有錯誤或不當之處,還請不吝指正。</P><P><STRONG>CBX誕生的背景</STRONG></P><P> 就我所見,網上對CBX的問題主要集中在這幾個方面:Borland公司出于什么動機開發CBX,它與C++Builder的關系怎樣?CBX的framework詳情如何,與VCL的關系怎樣?Borland公司對CBX的定位和長期計劃是什么?<BR> 要回答這些問題,首先必須從開發CBX的背景說起。<BR> 如大家所知,Borland公司在2003年發布了一系列的新產品,其中在<a target="_blank" href="http://www.malegebide.com" class="wordstyle">Windows</a>/.NET平臺的開發工具就有三個:Delphi.NET、C#Builder與CBX。這些新產品的推出,表示著Borland公司在<a target="_blank" href="http://www.malegebide.com" class="wordstyle">Windows</a>平臺下的開發工具陣營發生了大的變革和分化。而這些變化的發生,又根源于操作系統本身的一次深刻的革命,即從Win32平臺到.NET平臺的全面過渡。<BR> 根據我的所見所聞,國內有不少技術人員仍然對這一轉變沒有足夠的認識。簡言之,Microsoft公司已經下定決心,將操作系統從Win32全面轉向.NET;逐漸地,Microsoft不會再提供新的Win32 API,未來操作系統的新功能將全部以.NET SDK的方式提供;從企業級服務器,<font id="fphfkcmabpt">絡?教-育國-n國OE</font>到桌面系統,<span id="cvrbluwijrjjpmu">Q網的"_'F|L教4R網網D</span>再到嵌入式系統,.NET將是Microsoft公司解決方案中的統一的編程模型。雖然這個轉變緩慢、艱難、痛苦,但這是歷史潮流的方向。無論你是否喜歡,除非你放棄在Microsoft平臺下的開發工作,否則就只能適應它。<BR> 這一轉變給<a target="_blank" href="http://www.malegebide.com" class="wordstyle">Windows</a>平臺的開發工具廠商帶來了很大的挑戰,Borland公司也不例外。目前的形勢,就和當年從DOS過渡到<a target="_blank" href="http://www.malegebide.com" class="wordstyle">Windows</a>的情況差不多,整個操作系統與編程模型與發生了徹底的變革。Borland的Delphi和C++Builder都深深植根于Win32平臺,面對這一轉變,必須作出積極的反應,才能求得生存和發展。Borland公司確實也做出了這種反應。<BR> 正象大家看到的那樣,Delphi的方向是和操作系統一起轉向.NET平臺,其結果就是Delphi.NET的誕生,它將和全新的C#Builder一起,成為 Borland公司在.NET平臺下的主力開發工具。(但Delphi仍然保留了在Win32下進行開發的能力,因為Win32平臺下的應用程序在未來相當長的一段時間內會繼續存在。)<BR> 至于C++Builder的方向,在Borland公司內部進行過討論,結果大家應該已經猜到了,那就是C++Builder并沒有向.NET靠攏,而是堅持走原生開發工具的道路,并且擴展到了多個平臺、多個編譯器。原來C++Builder和Delphi一起,由同一個RAD開發小組進行開發,這也是為什么C++Builder和Delphi總是交替升級版本的原因之一。Borland在做出這個決定以后,成立了新的C++/Mobile開發小組,C++開發工具從此和Delphi分道揚鑣。<BR> Borland為什么做出這一決定,有多種原因。首先,原生C/C++開發仍然是最重要的市場之一。在Microsoft以外的平臺上,無論是服務端的Unix/Linux,<span id="ojcstsrqdquocmkjerq">sn提V(ypg理jD9y]^p9管件</span>還是越來越熱門的嵌入式系統,C/C++仍然是挑大梁的語言。即使在Microsoft平臺下,往.NET的過渡完成以后,在某些底層的開發中C/C++仍然具有不可替代的地位?;仡橞orland C++的光輝歷史,展望未來的戰略布局,Borland都不能夠放棄這一市場。其次,C++語言有其特殊性,不適合向.NET移植。熟悉.NET平臺的朋友可能知道,Delphi的許多特性與C#語言相當類似,從對象引用模型,到單根繼承結構,以及PME(property, method, event)模型,無不如此(畢竟C#和Delphi同出自于Anders之手)。對Delphi進行擴展和調整,以符合.NET CLS(Common Language Specification),并不會損害Delphi的風格,反而有利于一個更強大的Delphi。而C++則具有完全不同的開發思想,如果要符合CLS,必須對C++進行大幅度的修改,結果是C++不再成其為C++了。Visual Studio .NET中提供的Managed C++,在C++社群中并沒有得到普遍的認同,就是一個例子。<BR> 在這種情況下,C++Builder不是轉向.NET而是另辟蹊徑,不能不說是明智之舉,甚至可能是唯一的選擇。</P><P><STRONG>兼容性和VCL</STRONG></P><P> CBX的向下兼容性,特別是與VCL的兼容性,在網上是備受矚目的問題。<BR> 這個問題可以明確地回答如下:在CBX中,沒有VCL。CBX內置的framework,是一個全新的、100%由C++開發的、跨平臺的framework,其中的GUI部分,基于第三方的跨平臺的wx<a target="_blank" href="http://www.malegebide.com" class="wordstyle">Windows</a>組件庫(GUI及相應的RAD功能在CBX 1.0中還沒有,將在2.0中提供)。<BR> 由于歷史的原因,C++Builder的framework使用了Delphi的VCL。這使得C++Builder的程序員往往發現自己處于一種相當尷尬的境地:他不得不與另外一種語言寫成的framework打交道。而且,為了和VCL兼容,C++Builder中增加了象__property這樣的非標準語法,從而使C++Builder看上去象一個Delphi的復制品。因此,網上有“BCB的高手必定是Delphi的高手”的說法。從C++Builder誕生的那一天開始,用C++重寫整個framework的呼聲就沒有停止過。<BR> CBX的誕生,使得這個愿望終于實現了,而且這個framework甚至超過了我們的期望:它不但完全使用標準C++寫成,而且支持跨平臺和交叉編譯(Cross Compilation,即在一個平臺下編譯生成另一個平臺下的可執行代碼),同時也對某些專業領域,例如嵌入式開發,提供了專門的支持。另外,它還能夠方便地掛接ACE、Loki、Boost等第三方的C++庫。<BR> 但是,這種改變也有不利的一面,那就是CBX不再向下兼容VCL。這是許多技術人員表示不滿的原因,因為原來的C++Builder已經與VCL密不可分,CBX拋棄VCL,將會導致C++Builder的程序員必須重新學習新的framework,并且給原有代碼的升級帶來很大的麻煩。許多質疑都指向同一個問題:為何Borland沒有實現VCL向C++的平滑過渡?<BR> 這個問題確實是一個很大的問題,可以追溯到當初Borland在開發C++Builder的時候,為什么沒有用C++開發自己的framework,而是不惜修改C++,讓它使用由Object Pascal編寫的VCL;以及為什么在C++Builder的6個版本的升級過程中,<div id="cnqonbjqrgvq">foBW|IrbG|N件</div>一直沒有用C++重寫VCL;甚至涉及到 Delphi的設計思想與C++和Object Pascal的區別。<BR> 一般認為,Borland當初是出于時間和資金的壓力,才出此下策,讓C++Builder嫁接到基于Object Pascal的VCL上。我曾經也持這種觀點,但是后來在逐步深入學習Delphi和C++的過程中,才慢慢發現,這一舉動可能有更重要的原因,那就是由于C++和Object Pascal的差異,將VCL移植到C++有著幾乎不可克服的困難。<BR> 以所謂“虛擬構造函數”為例,在C++中,構造函數不能夠是虛擬的。C++之父Bjarne Stroustrup博士曾針對此問題進行過討論:“虛擬調用是一種能夠在給定信息不完全(given partial information)的情況下工作的機制。特別地,虛擬允許我們調用某個函數,對于這個函數,僅僅知道它的接口,而不知道具體的對象類型。但是要建立一個對象,你必須擁有完全的信息。特別地,你需要知道要建立的對象的具體類型。因此,對構造函數的調用不可能是虛擬的?!钡窃贠bject Pascal中,構造器(constructor)卻可以是虛擬的。原因是,Object Pascal的對象模型與C++不同。在Delphi中,有所謂的“類類型”(TClass),這是一個描述類的相關信息的類,類似于C++中的type_info類,但比后者強大得多。更重要的是,Object Pascal會根據類類型來決定創建的對象,通過這種機制,它避免了“給定信息不完全”的問題,從而輕易地實現了虛擬構造器。<BR> 同時,這種機制也導致了Object Pascal和C++中的RTTI的巨大差異:標準C++中的RTTI只能得到類名稱(編譯器可以提供額外的RTTI支持,但很有限),而Object Pascal中的RTTI不但可以得到類名稱、類繼承關系、對象實例大小,還可以獲得類的屬性、方法、事件等信息。Delphi中的這種RTTI類似于Java/C#中的Reflection,或者也許可以反過來說,Java/C#中的Reflection受到了Object Pascal的影響。Object Pascal之所以能做到這一點,又離不開它的單根繼承結構:由于Object Pascal中所有的類都繼承自TObject,因此可以輕易地添加RTTI信息。在這一點上,C++和它又有著本質的區別。<BR> 在VCL的源碼中,大量地使用了類類型和虛擬構造的技術來構建龐大的繼承樹,而強大的RTTI則更是整個Delphi組件模型的基礎。如前所述,由于Object Pascal和C++在語言上的差異,要用C++依樣畫葫蘆地重寫一遍VCL,根本就是不可能做到的事情。說到底,這已經是業界兩種不同的編程思想之間的差異,不是簡單地折衷一下就可以調和的。<BR> 讓我們把這件事放到更大的歷史背景中來看。Anders開發Delphi的時候,正是C++借助OOP思想快速成長,而Pascal語言日趨沒落的時候。Anders不但果斷地突破了標準Pascal的限制,將OOP全面引入到新的Object Pascal中,而且針對C++在實踐中暴露出來的一些問題,有意識地進行了彌補和改進,以構建新一代的framework。這一行動的結晶就是VCL的誕生。事實上,Object Pascal/VCL的許多經驗,后來也被Java/C#所汲取,用于構建J2EE/.NET中的組件架構。從這個過程,我們可以看到編程思想與編程語言的演化。<BR> 當然,這并不是說C++就已經沒落過時。事實上C++也一直在不斷的成長中,上述的問題,可能有別的解決途徑。拿“虛擬構造函數”來說,Stroustrup本人就指出,可以通過工廠模式(factory pattern)來間接實現。用C++構建一個功能上類似VCL的framework,是完全可以做到的,但是實現后的產物,肯定與Object Pascal寫成的VCL大相徑庭。其實這已經與C++Builder程序員們的初衷相去甚遠了。我認為,這才是Borland權衡利弊,最后不惜損害C++的兼容性,把C++Builder嫁接到VCL上的主要原因。<BR> 考慮到這些因素以后,VCL沒有在CBX中延續其生命就是很容易理解的了。另外一個重要原因是,VCL是在<a target="_blank" href="http://www.malegebide.com" class="wordstyle">Windows</a>平臺上發展起來的,因此很多地方都只考慮到跟<a target="_blank" href="http://www.malegebide.com" class="wordstyle">Windows</a>平臺的集成。Borland既然已經決定另起爐灶,打造一個完全跨平臺的C++開發工具,自然會趁此機會,擺脫與VCL扯不斷理還亂的關系,用全新的、100%C++的framework取而代之。</P><P><STRONG>IDE</STRONG></P><P> CBX將使用JBuilder的IDE,這一消息現在已經得到了證實。為什么C++開發工具卻要使用一個用Java寫成的IDE?這也是引起許多朋友質疑的地方。<BR> CBX選用JBuilder的IDE,至少部分是由于統一IDE的需要。眾所周知,Borland作為一個平臺中立的廠商,在很多平臺上都有自己的開發工具,隨著這些開發工具的發展與分化,統一IDE已經是不可避免的趨勢。據稱,Borland以后將只維護兩個基本的IDE,即基于.NET的Galileo和基于Java的PrimeTime。C#Builder和Delphi.NET基于前者,JBuilder則基于后者。CBX作為一個以跨平臺為重要特征的開發工具,選擇后者作為IDE是順理成章的事情。<BR> 事實上,當我們把眼界放開闊后,就會很容易地發現,統一的IDE已經成為業界的一股潮流。Microsoft在Visual Studio.NET中提供了統一的IDE,同時支持VC#、VB.NET和VC++.NET等多種語言。IBM主持下的Java IDE項目Eclipse,宣稱以后將以CDT(C/C++ Development Toolkit,用于Eclipse的C/C++開發工具箱)為重要的發展方向。SUN的NetBeans則早已將C/C++納入支持的范圍。可以說,用運行于Java/.NET這樣的受管制代碼(Managed Code)之上的IDE來作為C/C++的開發環境,并非Borland的首創,反而是順應潮流之舉。<BR> 另外,以我的個人意見,JBuilder的IDE確實要比Delphi/C++Builder強上很多。雖然JBuilder背有速度緩慢的惡名,但是在硬件條件能夠保證的情況下,它的CodeInsight、Code Template以及Refactoring等功能,比Delphi/C++Builder明顯領先,更不用說對UML的支持以及和Together Edition for C++的集成。因此,我認為CBX借用JBuilder成熟強大的IDE,是一件好事。</P><P><STRONG>C++的未來</STRONG></P><P> 讓我們暫時拋開CBX,來看看C++語言本身的一些東西。<BR> 毫無疑問,C++仍然是最主要的工業語言標準之一,特別是近幾年來,C++語言出現了蓬勃的發展,各種新技術和新概念層出不窮,世界范圍內的C++社群也是蒸蒸日上。但是,勿庸諱言的是,C++的地位確實受到了來自Java/C#的有力挑戰。在應用領域、特別是在高端的應用領域中,<div id="wemgitwpofeeosbwpw">&vCv育網網`N~@`Uq垠-Ij</div>Java正在逐漸取代C++成為主流。<BR> 導致這種情況的原因是多樣的,但最主要的原因有兩個。一個是C++的標準推出太晚,直到1998年ISO C++標準才正式推出,在此之前,各種風格的C++版本把時間浪費在內耗上,將大片的市場拱手讓給了Java。另一個更重要的原因是,雖然ISO C++標準的制定統一了C++的語言,但是卻沒有統一C++的framework。雖然C++標榜自己是平臺無關的語言(它的確也是),但是對于同一個問題,在不同的平臺下有各種不同的解決方案。C++自己的標準庫只是一個語言的framework,而不是一個應用的framework:在I/O,多線程,Socket,GUI,數據對象模型等等常見的問題上,開發者們不得不要么自己封裝特定平臺的API,要么尋找難以保證質量的第三方類庫。沒有統一framework的C++,就象沒有VCL的Delphi,沒有JFC的Java,沒有.NET framework的C#。因此毫不奇怪,C++在應用領域無法與Java/C#抗衡,而逐漸退守到底層編程。<BR> 去年10月,Bjarne Stroustrup博士訪華的時候,我曾經當面向他提出過這個問題:為什么C++沒有一個統一的、跨平臺的、面向應用的framework?C++的標準庫是否有向這個方面努力的計劃?Stroustrup博士嚴肅地回答了這個問題。他說,與Delphi、Java、C#不同的是,C++是一種廠商中立的語言,它的標準掌握在ISO C++委員會手中。這固然保證了C++的純潔性,但也導致了沒有廠商投入大量的資源來開發一個統一的framework——即使有廠商這么做了,也不一定能夠保證它的權威性。最后,他建議我可以考慮利用一些優秀的第三方庫。<BR> 由于這個問題涉及到很多技術之外的因素,甚至涉及到C++本身的目標和定位,看來沒有也不會有更好的解決辦法了。誰知沒過多長時間,事情突然出現了轉機。Borland的C++BuilderX,不正是在試圖扮演一種這樣的角色嗎?<BR> 從背景來看,Borland作為老牌的開發工具廠商,在C++編譯器和framework的開發方面的技術和經驗是無可置疑的。而Borland往日最大的競爭對手Microsoft已經明顯地將重心轉移到.NET和C#,不會再大幅度地發展原生的Visual C++,更不會去開發面向應用的C++ framework。因此,Borland等于接收了Microsoft轉型后留下的真空。同時,Borland也是業界具有領導地位的軟件公司中,唯一一家完全平臺中立的公司,這和C++的宗旨是相稱的;由它來完成一個真正跨平臺的C++ framework,真是再合適不過了?;蛘叻催^來說,除了Borland,業界很可能不會再有一家廠商會來承擔這一工作。<BR> 從目前看到的產品來說,CBX確實在各方面都達到了目標。統一的、跨平臺的、符合ISO C++標準的framework(包括用于RAD的GUI解決方案);跨平臺的IDE;支持多種編譯器;支持交叉編譯;跨平臺的數據庫訪問引擎(dbExpress);對移動設備開發的解決方案;對Boost、ACE、Loki等第三方C++庫的開放式支持;再加上與Together Edition for C++BuilderX的集成,<span id="ccjdlsjkcku">e教nl(V提}uE9</span>引入了令人激動的MDA開發方式;即使是Stroustrup本人,恐怕也難想象比這更好的C++了。<BR> 第一次見到CBX的演示的時候,確實很給人震撼的感覺。我曾經和包括公司同事在內的一些朋友熱烈地討論過,一旦CBX成功,會產生什么樣的后果?在一個統一的、跨平臺的framework的影響力之下,C++是否會重返應用領域?Java/C#的市場是否會因此受到沖擊?不僅是Borland C++這個令人難忘的名字,而且是整個C++世界,是否都會契此機會東山再起,重振聲威?一切都有待市場的檢驗。<BR></P></span></span> <div id="Message" class="Message"></div></font></div>
<div></div>
</td>
</tr>
<tr>
<td align="right" height=25 bgcolor=#F7F7F7 style="display:block;padding:0px 10px">
[<script language=JavaScript src="/article/Hits.Asp?ArticleID=18350"></script>]
[<a href="javascript:history.go(-1)">返回上一頁</a>]
[<a href=javascript:window.print()>打 印</a>]
[<a href="/user/favorite.asp?action=add&topic=關于Borland C++BuilderX的一些問題的回答">收 藏</a>]</td>
</tr>
<tr>
<td style="display:block;padding:0px 10px"><div>上一篇文章:<a href=/article/1/14/2006/2006092518349.html>2003-09-15 Borland發布Borland&reg; C++BuilderX&reg;與 Borland&reg; Enterprise Studio for C++</a></div><div>下一篇文章:<a href=/article/1/14/2006/2006092518351.html>《數據結構的C++偽碼實現》(《DATA STRUCTURES A Pseudocode Approach with C++》)讀書筆記(一)</a></div></td>
</tr>
</table>
<table width="575" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="titlebg1">∷相關文章評論∷ ?。ㄔu論內容只代表網友觀點,與本站立場無關?。?[<a href=/article/comment.asp?ArticleID=18350 target=_blank>更多評論</a>…]</td>
</tr>
<tr valign="top">
<td></td>
</tr>
</table>
</td>
</tr>
</table>
<!-- 頁面底部開始 -->
<table width="778" border="0" align="center" cellpadding="0" cellspacing="0" class="tableborder">
<tr>
<td height="5"></td>
</tr>
<tr>
<td height="8" class="linebar"></td>
</tr>
<tr>
<td height="5"></td>
</tr>
<tr>
<td height="65" align="center" class="tablebody">QQ:310646
<a href="/admin/admin_login.asp" target="_blank" class="navmenu">A</a>
Copyright © 2006 <font face=Verdana, Arial, Helvetica, sans-serif><b>Malegebide.Com</b></font>. <script language="javascript" type="text/javascript" src="http://js.users.51.la/529370.js"></script>No Rights Reserved <br></td>
</tr>
<tr>
<td height="5"></td>
</tr>
</table>
</body>
</html>
<script language="javascript" src="/inc/Std_StranJF.Js"></script>
<!-- 頁面底部結束 -->
<script src="/count.asp" type="text/javascript"></script>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -