您知道C++/CX嗎?
最近裝了VS11Beta,才關注有關WinRT的信息。C++這次又被微軟“擴展”了,新名字叫C++/CX。
C++/CLI是微軟為了讓C++代碼能夠在.Net上運行所做的嘗試(誰還記得Managed C++),C++/CX是為了讓C++程序員能在WinRT上“輕松”地一展身手所做的擴展。
現在C++/CX的資料非常少,Google上搜索一下,頭條就是Inside the C++/CX Design,是微軟Visual C++團隊的一個哥們寫的。看他的照片,一臉苦逼樣,就知道他被C++折磨得非常不爽。
他的文章中也是充滿了痛苦。為了迎合微軟的COM技術(為什么微軟老是抱著COM不放)和WinRT的模型,他們嘗試了各種方法,例如寫一個完全符合C++標準的純類庫(WRL),但是發現這個類庫使用還是非常不方便,因為寫一個COM組件是非常麻煩的事情,必須有很多工具配合。如果沒有Visual Studio,我估計不會有多少人愿意寫COM組件。于是他們再一次擴展了C++(有點類似ATL Attributes),編譯器會自動生成很多代碼來把一個類搞成COM兼容,例如自動生成uuid,各種借口定義等。當然一切都是native的代碼,并不涉及類似.Net的托管問題。
當然,文章很短,評論才是經典。國外的程序員們也表達了他們的憤慨,以及對于微軟Visual C++團隊改語言癖好的不滿。很多人認為即使是編譯器自動生成代碼,使用標準C++語法已經足夠了,根本不用再去搞擴展。
只有C++程序員才能體會,對于擴展C++的強烈反感。C++的一個特點就是,自己跟自己不兼容,一旦有新特性,就要花費很多精力去把這個新特性和已有特性結合,而且很多情況下,這種結合會產生很多問題和陷阱。
我現在還沒有搞清楚,他們說WinRT算是一個和.Net并行的新一代開發平臺,底層由C++實現,上層可以由多種語言使用;您看,現在C++自己的平臺,居然還要把自己折磨成這樣才能使用,您說C++糾結不糾結?
話說C++11出來,新特性很多,讓本來就復雜的C++更進一步——以后誰要是學C++,那得從C開始,到面向對象,到模版,到STL,到其他標準庫(輸入輸出、正則表達式、線程等等),哪一個都不是能輕松搞定的。沒準還要注意C++各種陷阱和最佳實踐,于是要看(More)Effective C++(STL)等書。沒準還要知道C++的工作原理才能裝成高手,于是就要看C++對象模型。還有高手鉆研C++標準嗎?
以前寫個C++類,稍微有點復雜度,就要提供構造、析構、拷貝、賦值函數(copy assignment),現在還要加上另一個賦值函數(move assignment),才能讓這個類有比較正常的行為。考慮繼承,則需要考慮多重繼承的影響,是否virtual繼承,使用public、protected還是private繼承。寫個方法就要考慮是否virtual,是否pure,最后pure virtual的析構函數居然還得提供實現。在實現實際的功能之前,為了符合C++的語義環境,很多時間都得花在這些瑣碎之事上。
C++這個本來就很復雜的東西,卻被微軟一而再,再而三地擴展,來適應微軟同樣很復雜的COM技術。想到這里,誰都有一種去學C#的沖動。隨便看一本C#編程教材,使用VisualStudio,我們就可以開發WinForm,ASP.Net,WPF,Silverlight,可以編寫組件,可以找工作。
C++/CX,是C++在新一代Windows環境中的爆發,還是在新一代Windows環境中的滅亡?這個是問題。

浙公網安備 33010602011771號